msbuild - vampiros - manipular archivos y directorios en c#
¿Cómo puedo evitar esta estructura de carpetas profunda con MSDeploy al sistema de archivos usando MSBuild? (3)
Estoy sacando mi pelo sobre este problema de MSBuild.
Estamos usando 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 apunta a esta carpeta para brindarnos una integració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]
Tengo muchas ganas de desplegar en carpetas predecibles como ...
C: / build / website [archivos publicados] C: / build / mobilewebsite [archivos publicados]
Ese es el fondo. Aquí están las preguntas específicas.
¿Estamos cometiendo un error al intentar utilizar MSDeploy para publicar en un sistema de archivos local? Básicamente, necesitamos el equivalente de la función de "publicación" VS2010, con transformaciones de configuración. No estamos intentando implementar instancias remotas de IIS ni nada.
¿Hay alguna forma de hacer esto pero especificando las carpetas de publicación?
He estado tratando de usar la tarea de Copia de MSBuild para copiar los archivos en carpetas más sensibles, pero no puedo averiguar cómo usar comodines para especificar las carpetas que necesitamos tomar, tendría que ser algo como ...
C: / FolderPackageEndsUpIn [ANYFOLDERS] / Website [ANYFOLDERS] / PackageTmp * *.
¡Ayuda!
Hay una solución ligeramente oculta pero elegante.
Cuando se ejecuta una compilación en un servidor de CI compartido, puede ser difícil empaquetar en c: root por razones de aislamiento. En última instancia, se preferiría eliminar la ruta profunda en el propio paquete.
Afortunadamente, hay una solución. ¡Agregue una regla de reemplazo en el archivo .pubxml! Lo encontré en el suplemento de MS Build Engine, 2ª edición: https://www.microsoft.com/learning/en-us/book.aspx?ID=16854
También lo encontré en este blog: http://learnaspmvc.blogspot.se/2014/07/web-packaging-fixing-long-path-issue.html
Puede utilizar WebDeploy directamente para obtener un resultado más optimizado. Por ejemplo, puede usar el siguiente comando para sincronizar 2 carpetas directamente de raíz a raíz:
>"%ProgramFiles%/IIS/Microsoft Web Deploy/msdeploy.exe" -verb:sync -source:dirPath=<SourceFolder> -dest:dirPath=<DestinationFolder>
O puede hacer que WebDeploy incluya la configuración de IIS en el destino utilizando el proveedor 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" en el sitio web predeterminado, lo llamarás 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 / el empaquetado llamando directamente a WebDeploy y se ejecutará como un evento posterior a la compilación.
Si agrega el parámetro _PackageTempDir a MSBuild, obtendrá los mismos resultados que al hacer una publicación local. p.ej
msbuild C: / PathToMyProj.csproj / p: Configuration = UAT; DeployOnBuild = true; PackageAsSingleFile = False; DeployTarget = Package; _PackageTempDir = c: / PathToMyDeploy /; AutoParameterizationWebConfigConnectionStrings = false
Este comando publicará todos mis archivos en c: / PathToMyDeploy / sin las subcarpetas locas