deployment - linea de comandos del evento posterior a la compilacion
MSBuild: Despliegue de archivos que no están incluidos en el proyecto (3)
¿No puedes usar un evento de creación posterior para ejecutar un script y hacer lo que quieras? Utilizo uno para mover mis archivos de salida a una ubicación completamente ajena al proyecto. Ya sea un lote simple, VBScript / JScript o PowerShell, puede hacer prácticamente todo lo que quiera.
Tengo un evento de preconstrucción en un proyecto web que minimiza y concatena los archivos javascript utilizando un nodo. Esto crea una carpeta llamada BuiltScripts en la carpeta de scripts que es un duplicado de la carpeta de scripts, excepto que los archivos están minificados. Cuando estoy haciendo una implementación, quiero publicar la carpeta de scripts, incluida la carpeta BuiltScripts dentro de ella. Para lograr esto, he agregado la carpeta BuiltScripts al proyecto. Esta no es una solución ideal como:
- Tengo que tener la carpeta BuiltScripts desprotegida para compilar ya que los archivos en ella son de solo lectura ya que la solución está bajo control de fuente. Esto crea molestias al registrarse ya que tengo tantos archivos desprotegidos.
- Cuando agregue un nuevo archivo al proyecto, debo asegurarme de recordar agregarlo a la carpeta BuiltScripts o no se implementará la versión construida del archivo.
- Mi compilación fallará en el servidor de compilación ya que los archivos en la carpeta BuiltScripts solo se leen allí también.
- Tener dos copias de un archivo con el mismo nombre es un problema al buscar archivos y realizar búsquedas basadas en texto.
Me gustaría que el servidor de compilación construya y minifique los archivos de JavaScript como un paso previo a la compilación, pero no quiero que la carpeta BuiltScripts se agregue al proyecto. Sin embargo, cuando el servidor de compilación empaqueta el proyecto al final, quiero que copie la carpeta BuiltScripts con el resultado del proceso de compilación. ¿Cómo puedo conseguir esto?
En lugar de utilizar el evento de precompilación de las propiedades del proyecto (que creo que es lo que quiere decir), anule el objetivo BeforeBuild en el archivo .csproj / .vbproj.
<Project ...>
...
<Target Name="BeforeBuild">
<!-- Create the ''BuildScripts'' directory. -->
<!-- The $(IntermediateOutputPath) reference the ''obj'' folder, which I like to -->
<!-- use for these kinds of things. -->
<MakeDir Directories="$(IntermediateOutputPath)BuiltScripts">
<Output PropertyName="BuildScriptsPath" TaskParameter="DirectoriesCreated" />
</MakeDir>
<!-- Execute the javascript minifier. -->
<Exec Command="..." />
<!-- Create an item group for the minified scripts so we manipulate the target path. -->
<CreateItem Include="$(BuildScriptsPath)/*.js">
<Output ItemName="BuiltScripts" TaskParameter="Include" />
<Output ItemName="FileWrites" TaskParameter="Include" />
</CreateItem>
<!-- Add the minified scripts to the Content item group, -->
<!-- which the deployment MSBuild inspects for files to deploy. -->
<CreateItem Include="@(BuiltScripts)"
AdditionalMetadata="TargetPath=scripts/%(Filename)%(Extension)">
<Output ItemName="ContentWithTargetPath" TaskParameter="Include" />
</CreateItem>
</Target>
...
</Project>
Es posible que tenga que jugar con la forma del grupo de elementos Contenido que es el resultado de la tarea CreateItem si los archivos no se despliegan en el directorio correcto. Tenga en cuenta que utilicé una transformación de elemento para hacer las scripts/YourScript.js
destino scripts/YourScript.js
.
También tenga en cuenta que la primera tarea CreateItem completa el resultado en un grupo de elementos llamado ''FileWrites''. Descubrí que el objetivo Limpio inspecciona ese grupo de elementos para saber qué archivos eliminar.
Coloque ese XML en su archivo de proyecto después de los elementos <Import>
y debería estar listo para continuar. No se requiere control de fuente de entrada e incluso su servidor de compilación estará contento.
Tenía un requisito similar, aunque solo implicaba agregar archivos existentes a un paquete de implementación en lugar de generarlos como parte de la compilación. Encontré la técnica en esta página útil.