2011-02-01 21 views
15

Estoy tratando de ejecutar un comando como parte de mi proceso de empaquetado/implementación a través de MSDeploy. En particular, estoy tratando de crear un registro de eventos personalizado ejecutando installutil contra uno de mis archivos DLL, pero estoy teniendo problemas para especificar una ruta relativa 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 Manifest. Tenga en cuenta la ruta absoluta a la DLL.MSDeploy runCommand utilizando la ruta relativa

<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 package.zip. Cuando me encontré con MyTestApp.deploy.cmd/Y correctamente llamado MSDeploy y desplegado mis archivos a inetpub \ wwwroot \ MyTestApp y pasé comando desde el manifiesto a continuación:

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

El problema que estoy teniendo es que hago No quiero codificar esta ruta DLL a c: \ inetpub \ etc. ¿Cómo puedo hacer la llamada anterior utilizando la ruta relativa relativa desde mi directorio de implementación en el Sitio web predeterminado? Idealmente, me gustaría MSDeploy para tomar esta ruta y pasarla como una variable a la instrucción runCommand para encontrar la DLL. Entonces podría escribir algo como: <path>installutil $DeploymentDir\NewTestApp\bin\BusinessLayer.dll</path> sin tener que preocuparme por codificar una ruta de acceso absoluta en.

¿Hay alguna manera de hacer esto sin usar la ruta absoluta a mi DLL cada vez?

Respuesta

1

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

Creamos una secuencia de comandos de powershell en el servidor de destino. Así que en lugar de ejecutar su comando:

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

Nos ejecutar:

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

El "nombre del sitio" se pasa como un parámetro en el script de PowerShell. Dentro del script, sabe en ese servidor de destino qué archivos instalar, cualquier comando que necesite ejecutarse, grupos de aplicaciones para reciclar, etc.

De nuevo, no es tan fácil como encontrar una ruta relativa, pero cumple su función.

+1

Esto parece ser una recomendación un tanto oficial, también: http://social.msdn.microsoft.com/Forums/en/msbuild/thread/1044058c-f762-456b-8a68-b0863027ce47 –

4

Puede añadir definición de DeploymentDir a la .csproj con la acción que escribió más arriba:

<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> 

condiciones theese permitirá cambiar todo, desde la línea de comandos para tomar el control total sobre el proceso de construcción de su sistema de construcción o script

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

Y en el interior de la tarea que se puede utilizar

<ItemGroup> 
    <MsDeploySourceManifest Include="runCommand"> 
    <path>installutil $(ApplicationDeploymentDir)\BusinessLayer.dll</path> 
    </MsDeploySourceManifest> 
</ItemGroup> 
+4

Eso solo funcionaría para DeploymentDir especificado en tiempo de compilación. Pero una vez que el paquete de implementación se implementará en un sitio web de producción, quién sabe cuál sería el directorio de implementación física en la máquina de destino. –