msbuild zip msbuildcommunitytasks

MSBuild y crear archivos ZIP



msbuildcommunitytasks (2)

Aquí está mi script de compilación:

<?xml version="1.0" encoding="utf-8" ?> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Import Project="$(MSBuildExtensionsPath)/MSBuildCommunityTasks/MSBuild.Community.Tasks.Targets"/> <PropertyGroup> <!-- Path where the solution file is located (.sln) --> <ProjectPath>W:/Demo</ProjectPath> <!-- Location of compiled files --> <DebugPath>W:/Demo/bin/Debug</DebugPath> <ReleasePath>W:/Demo/bin/Release</ReleasePath> <!-- Name of the solution to be compiled without the .sln extension --> <ProjectSolutionName>DemoTool</ProjectSolutionName> <!-- Path where the nightly zip file will be copyd --> <NightlyBuildPath>W:/Nightly_Builds/Demo</NightlyBuildPath> <!-- Name of the nighly zip file (YYYYMMDD_NightlyZipName.zip, date added automatically) --> <NightlyZipName>Demo</NightlyZipName> </PropertyGroup> <ItemGroup> <!-- All files and folders from ./bin/Debug or ./bin/Release what will be added to the nightly zip --> <DebugApplicationFiles Include="$(DebugPath)/**/*.*" Exclude="$(DebugPath)/*vshost.exe*" /> <ReleaseApplicationFiles Include="$(ReleasePath)/**/*.*" Exclude="$(ReleasePath)/*vshost.exe*" /> </ItemGroup> <Target Name="DebugBuild"> <Message Text="Building $(ProjectSolutionName) Debug Build" /> <MSBuild Projects="$(ProjectPath)/$(ProjectSolutionName).sln" Targets="Clean" Properties="Configuration=Debug"/> <MSBuild Projects="$(ProjectPath)/$(ProjectSolutionName).sln" Targets="Build" Properties="Configuration=Debug"/> <Message Text="$(ProjectSolutionName) Debug Build Complete!" /> <CallTarget Targets="CreateNightlyZip" /> </Target> <Target Name="CreateNightlyZip"> <PropertyGroup> <StringDate>$([System.DateTime]::Now.ToString(''yyyyMMdd''))</StringDate> </PropertyGroup> <MakeDir Directories="$(NightlyBuildPath)"/> <Zip Files="@(DebugApplicationFiles)" WorkingDirectory="$(DebugPath)" ZipFileName="$(NightlyBuildPath)/$(StringDate)_$(NightlyZipName).zip" ZipLevel="9" /> </Target> </Project>

Mi script funciona perfectamente, solo que hay un problema extraño. Cuando construyo un proyecto por primera vez y no hay una carpeta /bin/Debug creada durante la compilación, el archivo ZIP aún está vacío. Al ejecutar el script de compilación por segunda vez cuando la carpeta /bin/Debug está ahora en su lugar con los archivos compilados, el archivo se agrega al ZIP.

¿Cuál podría ser el problema al ejecutar script la primera vez que el archivo ZIP está vacío?


El problema está en la colección de elementos DebugApplicationFiles . Se crea antes de invocar la construcción. Mueva DebugApplicationFiles al destino CreateNightlyZip . Actualice su script de esta manera:

<Target Name="CreateNightlyZip"> <PropertyGroup> <StringDate>$([System.DateTime]::Now.ToString(''yyyyMMdd''))</StringDate> </PropertyGroup> <ItemGroup> <DebugApplicationFiles Include="$(DebugPath)/**/*.*" Exclude="$(DebugPath)/*vshost.exe*" /> </ItemGroup> <MakeDir Directories="$(NightlyBuildPath)"/> <Zip Files="@(DebugApplicationFiles)" WorkingDirectory="$(DebugPath)" ZipFileName="$(NightlyBuildPath)/$(StringDate)_$(NightlyZipName).zip" ZipLevel="9" /> </Target>


Si está disponible powershell 5.0 o superior, puede usar el comando powershell directamente.

<Target Name="Zip" BeforeTargets="AfterBuild"> <ItemGroup> <ZipFiles Include="$(OutDir)release/file1.exe" /> <ZipFiles Include="$(OutDir)release/file2.exe" /> </ItemGroup> <Exec Command="PowerShell -command Compress-Archive @(ZipFiles, '','') $(OutDir)release/zippedfiles.zip" /> </Target>