2012-10-12 296 views
6

Tengo un evento de preconstrucción en un proyecto web que minimiza y concatena los archivos javascript utilizando el 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:MSBuild: Despliegue de archivos que no están incluidos en el proyecto

  1. Necesito tener la carpeta BuiltScripts desprotegida para poder 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.
  2. Cuando agrego un nuevo archivo al proyecto, debo asegurarme de recordar agregarlo a la carpeta BuiltScripts o no se implementará la versión integrada del archivo.
  3. Mi compilación fallará en el servidor de compilación ya que los archivos en la carpeta BuiltScripts también se leen solo allí.
  4. 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 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?

+0

¿Qué está utilizando para deploy \ publish - es este objetivo estándar de msbuild o hizo algo personalizado? –

+0

@AlexeyShcherbak MSBuild, TFS, nada personalizado –

+0

Sospecho que Sayed Ibrahim Hashimi escribió esta publicación con respuesta después de su pregunta :). http://sedodream.com/2012/10/09/VSWebPublishHowToIncludeFilesOutsideOfTheProjectToBePublished.aspx –

Respuesta

5

En lugar de utilizar el evento de preconstrucció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> 

Puede que tenga que jugar con la forma del grupo de artículos de contenido que es la salida 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 la ruta de destino scripts\YourScript.js.

También tenga en cuenta que la primera tarea CreateItem rellena 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 elementos <Import> y debe estar listo para empezar. No se requiere control de fuente de entrada e incluso su servidor de compilación estará contento.

+0

¿Agregaría un paso para eliminar el contenido anterior de las carpetas de BuiltScripts? –

+0

Ejecuto el código de muestra y parece que el objetivo IncrementalClean eliminará los archivos automáticamente ya que están incluidos en el grupo de elementos FileWrites, lo cual es útil cuando elimina un archivo .js y ya no desea que se implemente. – Matt

0

¿No puedes usar un evento de creación posterior para ejecutar un script para hacer lo que quieres? Yo uso 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.

0

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 this page útil.

Cuestiones relacionadas