Scripting NuPkg Reference Changes for Testing
I was testing out some changes to versioning in Autofac. We have a MyGet feed, but all of the internal dependencies of the various NuGet packages when they’re built point to the CI versions, so it’s sort of hard to stage a test of what things will look like when they’re released – you have to rename each .nupkg file to remove the “-CI-XYZ” build number, open each .nupkg file, change the internal .nuspec file to remove the “-CI-XYZ” build number info, then re-zip everything up. In testing, I had to do this a few times, so I scripted it.
I put everything in a folder structure like this:
- backup – contains all of the original .nupkg files (renamed without the “-CI-XYZ”)
- msbuildcommunitytasks – contains the MSBuild Community Tasks set
Then I wrote up a quick MSBuild script for doing all the extract/update/rezip stuff. I could have used any other scripting language, but, eh, the batching and file scanning in MSBuild made a few things easy.
msbuild fixrefs.proj /t:Undo puts the original packages (from the
backup folder) into the test feed folder.
msbuild fixrefs.proj Does the zip/fix/re-zip.
One of the challenges I ran into was that the zip task in MSBuild
Community Tasks seemed to always want to add an extra level of folders
into the .nupkg – I couldn’t get the original contents to live right at
the root of the package. Rather than fight it, I used 7-Zip to do the
re-zipping. I probably could have gotten away from the MSBuild Community
Tasks entirely had I some form of
sed on my machine because I needed
FileUpdate task. But… Windows. And, you know, path of least
resistance. I think this was a five-minute thing. Took longer to write
this blog entry than it did to script this.
<?xml version="1.0" encoding="utf-8"?> <Project DefaultTargets="All" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0"> <PropertyGroup> <MSBuildCommunityTasksPath>.</MSBuildCommunityTasksPath> <SevenZip>C:\Program Files\7-Zip\7z.exe</SevenZip> </PropertyGroup> <Import Project="$(MSBuildProjectDirectory)\msbuildcommunitytasks\MSBuild.Community.Tasks.Targets"/> <ItemGroup> <Package Include="*.nupkg"/> </ItemGroup> <Target Name="All"> <MakeDir Directories="%(Package.Filename)" /> <Unzip ZipFileName="%(Package.FullPath)" TargetDirectory="%(Package.Filename)" /> <ItemGroup> <NuSpec Include="**/*.nuspec" /> </ItemGroup> <FileUpdate Files="@(NuSpec)" Regex="(.)\-CI\-\d+" ReplacementText="$1" WarnOnNoUpdate="true" /> <Delete Files="@(Package)" /> <CallTarget Targets="ZipNewPackage" /> <RemoveDir Directories="%(Package.Filename)" /> </Target> <Target Name="Undo"> <Delete Files="@(Package)" /> <ItemGroup> <Original Include="backup/*.nupkg" /> </ItemGroup> <Copy SourceFiles="@(Original)" DestinationFolder="$(MSBuildProjectDirectory)" /> </Target> <Target Name="ZipNewPackage" Inputs="@(Package)" Outputs="%(Identity).Dummy"> <Exec Command=""$(SevenZip)" a -tzip "$(MSBuildProjectDirectory)\%(Package.Filename)%(Package.Extension)"" WorkingDirectory="$(MSBuildProjectDirectory)\%(Package.Filename)" /> </Target> </Project>