2010-11-16 26 views
19

Estoy tirando de mi cabello sobre este problema de MSBuild.¿Cómo puedo evitar esta estructura de carpetas profundas con MSDeploy al sistema de archivos utilizando MSBuild?

Estamos utilizando TeamCity para crear una solución con dos sitios web de MVC. Como parte de la compilación, estamos implementando en una carpeta en el servidor de compilación. IIS señala a esta carpeta que nos proporcione una construcción de integración visible para la administración.

Aquí está el código del archivo MSBuild que usa MSDeploy para publicar un paquete, pero no como un archivo zip.

<Target Name="Deploy"> 
    <MSBuild 
    Projects="$(SolutionFile)" 
    Properties="Platform=$(Platform);Configuration=$(Configuration); 
    DeployOnBuild=true; 
    DeployTarget=Package; 
    PackageLocation=$(PackageLocation); 
    PackageAsSingleFile=False; 
    AutoParameterizationWebConfigConnectionStrings=False" /> 
</Target> 

El problema aquí es que obtenemos una estructura de carpetas increíblemente profunda. Aquí hay un ejemplo ...

C: \ DEPLOY \ Archive \ Content \ C_C \ Users \ Edmond \ Documents \ Visual Studio 2008 \ CreatioGreen \ Creatio \ Code \ core \ trunk \ Website \ Website \ obj \ Release \ Package \ PackageTmp [archivos publicados]

realmente quiero implementar en carpetas predecibles como ...

C: \ build \ sitio web [archivos publicados] C: \ build \ mobilewebsite [archivos publicados]

Ese es el fondo. Aquí están las preguntas específicas.

  1. ¿Estamos cometiendo un error al intentar usar MSDeploy para publicar en un sistema de archivos local? Básicamente, necesitamos el equivalente de la característica de "publicación" de VS2010, con transformaciones de configuración. No estamos intentando implementar en instancias de IIS remotas ni nada.

  2. ¿Hay alguna forma de hacerlo pero especificando las carpetas de publicación?

  3. He estado tratando de usar la tarea Copiar de MSBuild para copiar los archivos en carpetas más sensatas, pero no puedo encontrar la forma de usar comodines para especificar las carpetas que necesitamos tomar, sería necesario algo así como ...

C: \ FolderPackageEndsUpIn [ANYFOLDERS] \ Sitio web [ANYFOLDERS] \ PackageTmp * * .

¡Ayuda!

Respuesta

3

Puede usar WebDeploy directamente para obtener un resultado más ajustado. Por ejemplo, puede utilizar el siguiente comando para sincronizar 2 carpetas directamente de la raíz a la raíz:

>"%ProgramFiles%\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -source:dirPath=<SourceFolder> -dest:dirPath=<DestinationFolder>

O puede presentar WebDeploy incluyen configuración de IIS en el destino mediante el uso de proveedor de iisapp en lugar de DirPath:

>"%ProgramFiles%\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -source:iisApp=<SourceFolderOrIISPath> -dest:iisApp=<DestinationFolderOrIISPath>

Por ejemplo, para sincronizar desde una carpeta simple a una nueva aplicación "newapp" bajo sitio web predeterminado, se le llame de esta manera:

>"%ProgramFiles%\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -source:iisApp="d:\MyWebSite" -dest:iisApp="Default Web Site/NewApp"

Luego, puede tener un archivo por lotes que realizará la sincronización/empaque llamando directamente a WebDeploy y se ejecutará como un evento posterior a la construcción.

+0

gracias por responder, kateroh! Esto ayudó. – centralscru

+0

Lo estaba haciendo así hasta que descubrí que no podía hacer que las transformaciones de Web.config funcionaran. ¿Alguna idea sobre cómo hacer eso sin usar el objetivo del paquete? –

+0

Puede resolver este problema de las transformaciones de Web.config elaborando una regla de reemplazo de omisiones que haría que la implementación web salte la sincronización de web.config y reemplace web.release.config con web.config. Aquí hay una publicación de blog sobre las reglas de reemplazo de omisiones para que pueda comenzar: http://blogs.iis.net/msdeploy/archive/2008/05/23/how-to-write-skip-and-replace-rules-for- msdeploy.aspx – kateroh

19

Si agrega el parámetro _PackageTempDir a MSBuild, obtendrá los mismos resultados que si realizara una publicación local. p.ej.

msbuild C: \ PathToMyProj.csproj/p: Configuración = UAT; DeployOnBuild = true; PackageAsSingleFile = false; DeployTarget = paquete; _PackageTempDir = c: \ PathToMyDeploy \; AutoParameterizationWebConfigConnectionStrings = false

Este comando va a publicar todos mis archivos en c: \ PathToMyDeploy \ sin las subcarpetas locas

1

Hay una solución ligeramente oculta pero elegante.

Al ejecutar una construcción en un servidor de CI compartido, puede ser difícil empacar en la raíz c: por razones de aislamiento. En última instancia, uno preferiría eliminar la ruta profunda en el paquete en sí.

Afortunadamente hay una solución. ¡Agregue una regla de reemplazo en el archivo .pubxml! Lo encontré en el suplemento del ms dentro de la construcción del motor, 2ª edición: https://www.microsoft.com/learning/en-us/book.aspx?ID=16854

También me encontré en este blog: http://learnaspmvc.blogspot.se/2014/07/web-packaging-fixing-long-path-issue.html

Cuestiones relacionadas