Pregunta

Estoy tratando de ejecutar un comando como parte de mi proceso de empaque/implementación a través de MSDePloy. En particular, estoy tratando de crear un registro de eventos personalizado ejecutando instalación contra una de mis dlls, pero tengo problemas para especificar un camino relativo a la DLL desde el directorio de implementación. Para comenzar, agregué la siguiente configuración a mi csproj para generar el proveedor de runCommand dentro de mi archivo manifiesto. Tenga en cuenta el camino absoluto a la DLL.

<PropertyGroup>
    <!-- Extends the AfterAddIisSettingAndFileContentsToSourceManifest action to create Custom Event Log -->
    <IncludeEventLogCreation>TRUE</IncludeEventLogCreation>
    <AfterAddIisSettingAndFileContentsToSourceManifest Condition="'$(AfterAddIisSettingAndFileContentsToSourceManifest)'==''">
      $(AfterAddIisSettingAndFileContentsToSourceManifest);
      CreateEventLog;
    </AfterAddIisSettingAndFileContentsToSourceManifest>
  </PropertyGroup>
  <Target Name="CreateEventLog" Condition="'$(IncludeEventLogCreation)'=='TRUE'">
    <Message Text="Creating Event Log" />
    <ItemGroup>
      <MsDeploySourceManifest Include="runCommand">
        <path>installutil C:\inetpub\wwwroot\MyTestApp\bin\BusinessLayer.dll</path>
      </MsDeploySourceManifest>
    </ItemGroup>
  </Target>
  <ItemGroup>

Después de llamar a MSBuild, esto generó mi manifiesto correctamente dentro de mi paquete. Cuando corrí Mytestapp.deploy.cmd /y Se llamó correctamente msdeploy e implementó mis archivos a inetpub wwwroot mytestapp y ejecutó mi comando desde el manifiesto a continuación:

<runCommand path="installutil C:\inetpub\wwwroot\MyTestApp\bin\BusinessLayer.dll ... etc 

El problema que tengo es que no quiero codificar esta ruta DLL a C: inetpub etc. ¿Cómo puedo hacer la llamada anterior usando el camino relativo ¿Desde mi directorio de implementación en el sitio web predeterminado? Idealmente, me gustaría Msdeploy Tomar este camino y pasarlo como una variable a la declaración RunCommand para encontrar la DLL. Entonces podría escribir algo como: <path>installutil $DeploymentDir\NewTestApp\bin\BusinessLayer.dll</path> sin tener que preocuparse por codificar un camino absoluto.

¿Hay alguna forma de hacer esto sin usar el camino absoluto a mi DLL cada vez?

¿Fue útil?

Solución

Me doy cuenta de que esta no es la respuesta que probablemente quisiste escuchar, pero así es como lo logré.

Creamos un script PowerShell en el servidor de destino. Entonces, en lugar de ejecutar su comando:

installutil C:\inetpub\wwwroot\MyTestApp\bin\BusinessLayer.dll ... etc

Corríamos:

c:\WINDOWS\system32\windowspowershell\v1.0\powershell.exe d:\powershell\installSites.ps1 siteName <NUL

El "Sitename" se está pasando como un parámetro en el script de PowerShell. Dentro del script, sabe en ese servidor de destino qué archivos instalar, cualquier comando que deba ejecutar, las agrupaciones de aplicaciones para reciclar, etc.

Nuevamente, no tan fácil como encontrar un camino relativo, pero hace el trabajo.

Otros consejos

Puede agregar definición de implementmentDir al .csproj con la acción que escribió anteriormente:

<PropertyGroup>
<DeploymentDir Condition="'$(Configuration)'=='Release' AND '$(DeploymentDir)'==''">Release Deployment Dir</DeploymentDir>
<DeploymentDir Condition="'$(Configuration)'=='Debug' AND '$(DeploymentDir)'==''">Debug Deployment Dir</DeploymentDir>
<DeploymentDir Condition="'$(DeploymentDir)'==''">C:\inetpub\wwwroot</DeploymentDir>
<AplicationName Condition="'$(Configuration)'=='Release' AND '$(AplicationName)'==''">NewTestApp</AplicationName>
<AplicationName Condition="'$(Configuration)'=='Debug' AND '$(AplicationName)'==''">MyTestApp</AplicationName>
<ApplicationDeploymentDir Condition="'$(ApplicationDeploymentDir)'==''">$(DeploymentDir)\$(ApplicationName)\bin</ApplicationDeploymentDir>
</PropertyGroup>

Las condiciones permitirán cambiar todo desde la línea de comandos para tomar el control total sobre el proceso de compilación en su sistema de compilación o script.

MSBuild.exe yourproj.proj /p:Configuration=Release /p:DeploymentDir=D:\package /p:ApplivationName=BestAppForever

Y dentro de tu tarea puedes usarla

<ItemGroup>
  <MsDeploySourceManifest Include="runCommand">
    <path>installutil $(ApplicationDeploymentDir)\BusinessLayer.dll</path>
  </MsDeploySourceManifest>
</ItemGroup>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top