如何在构建后事件中获取版本号

时间:2011-09-20 14:14:33

标签: .net visual-studio-2010 .net-4.0 post-build-event assemblyversions

我想使用post-build事件自动创建nuget包,然后将其复制到我们网络上的共享文件夹,类似这样(版本号1.0.0.0。在MyLib.nuspec文件中指定):

nuget.exe pack "$(SolutionDir)MyLib.nuspec"
xcopy /Y "$(TargetDir)MyLib.1.0.0.0.nupkg" \\folder\subfolder\NuGetPackages

这有效,但现在我想更新这个脚本,以便它也包括程序集版本,但我无法在构建后事件中获得程序集版本。我需要这样的东西:

nuget.exe pack -Version $(AssemblyVersion) "$(SolutionDir)MyLib.nuspec"
xcopy /Y "$(TargetDir)MyLib." + $(AssemblyVersion) + ".nupkg" \\folder\subfolder\NuGetPackages

但$(AssemblyVersion)变量不存在......有什么想法吗?

4 个答案:

答案 0 :(得分:5)

此帖子构建脚本适合我。它在每个版本上打包并发布我的开发版本。很简单。

del $(ProjectDir)bin\Debug\*.nupkg
"$(ProjectDir)NuGet.exe" pack "$(ProjectDir)MyProject.csproj"
forfiles /P $(ProjectDir)bin\Debug\ /m *.nupkg /c "cmd /c "$(ProjectDir)NuGet.exe" push @FILE -Source \\SHARE\NuGet"

答案 1 :(得分:3)

试试这个:

编辑.csproj文件并添加此块:

<Target Name="AfterBuild">
    <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
        <Output TaskParameter="Assemblies" ItemName="CurrentAssembly" />
    </GetAssemblyIdentity>
    <Exec Command="xcopy /Y $(TargetDir)MyLib.%(CurrentAssembly.Version).nupkg \\folder\subfolder\NuGetPackages"></Exec>
</Target>

答案 2 :(得分:3)

尝试以下方法:

1)重命名.nuspec以匹配.csproj名称:

  

如果您的项目是: MyLib.csproj

     

将MyLib.nuspec重命名为 MyLib.csproj.nuspec

2)修改.nuspec文件,如下所示:

<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
  <metadata>
    <version>$version$</version>
    <authors>$author$</authors>
    <id>$id$</id>
    <title>$id$</title>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>$description$</description>
    <summary>$description$</summary>
  </metadata>
</package>

在这里,工作由Nuget的“$ version $”令牌(和其他人)完成

请查看此Nuget article以获取更多令牌和信息。

3)在您放置.csproj.nuspec文件的每个项目中使用以下Post Build Event(请删除Enter键):

mkdir "$(SolutionDir)GeneratedPackages"

"$(SolutionDir).nuget\nuget.exe" pack "$(ProjectPath)" 
-OutputDirectory "$(SolutionDir)GeneratedPackages" 
-basepath "$(SolutionDir)$(ProjectName)\$(OutDir)"

如果我们有一个解决方案C:\ MySolution \ MyLib.sln和c:\ MySolution \ MyLib \ MyLib.csproj中的项目,我们的.nuspec文件应该是c:\ MySolution \ MyLib \ MyLib.csproj.nuspec和Post Build Event Command看起来像:

mkdir "C:\MySolution\GeneratedPackages"

"C:\MySolution\.nuget\nuget.exe" pack "C:\MySolution\MyLib\MyLib.csproj" 
-OutputDirectory "C:\MySolution\GeneratedPackages" 
-basepath "C:\MySolution\MyLib\bin\debug\"

修复nuget.exe的路径。在我的情况下,我使用Nuget“自动重新生成缺少的构建依赖项”,我在解决方案中有一个本地副本,位于.nuget文件夹下。

  

请注意,我们不会使用.nuspec文件调用nuget,我们是   直接用.csproj调用它!!

     

此策略还将包括在中声明的所有项目依赖项   安装包时Nuget创建的packages.xml。   (每次你建立时自动)

你已经完成了!现在更改

中的程序集和文件版本
  

项目&gt;属性&gt;装配信息

     

重要提示:如果您设置$ author $和/或$ description $标记,请在此处填写程序集的公司和说明字段。如果您遇到麻烦,请删除$ author $和/或$ description $ tokens并尝试再次编译。

并构建您的Project,您将在/ GeneratedPackages文件夹中看到MyLib.X.X.X.X.nupack以及您在Project Properties中设置的版本。如果设置依赖项,您将看到它已自动包含在Package Dependencies中。

我们正在与Jenkins CI服务器一起使用此策略来自动构建解决方案并将包从GeneratedPackages复制到我们的自定义NugetServer。

您还可以使用

完成帖子构建活动
nuget push

将生成的包发送到Nuget Server

发布中的问题:

如评论中所述,存在一个问题,即不允许Nuget.exe在RELEASE模式下生成包。

这样做是为了解决它:

对于使用此脚本的每个项目:

  1. 项目属性&gt;建立
  2. 在“配置”下拉列表中,选择“所有配置”
  3. 在“输出”部分中,更改“输出路径:”字段,例如,我当前正在使用“bin”(没有cuotes)

答案 3 :(得分:1)

我尝试了giammin建议的内容,经过一些调整后,这对我有用:

<Target Name="AfterBuild">
    <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
       <Output TaskParameter="Assemblies" ItemName="CurrentAssembly" />
    </GetAssemblyIdentity>
    <Exec Command="copy /Y $(TargetPath) $(ProjectDir)Versions\$(TargetName)_%(CurrentAssembly.Version).dll" Condition="'$(ConfigurationName)' == 'Stage'" />
</Target>

我添加了“Condition”属性,以便我可以指定何时将其构建到特定位置(在我的情况下为回滚创建备份)。另外,“xcopy”给了我错误...但是正常的“复制”不是。

然后,在我的构建后事件中,我有这样的事情:

copy $(TargetDir)*.dll \\dev-server\folder

IF NOT "$(ConfigurationName)" == "Stage" EXIT

mkdir "$(ProjectDir)Versions"
copy /Y "$(TargetPath)" \\stage-server\folder

我希望所有这些都有所帮助。

请注意,构建后事件是在csproj XML的“AfterBuild”元素之前执行的。

所以你可以在你发布构建事件时使用:     nuget.exe pack“$(SolutionDir)MyLib.nuspec” 并为副本添加afterbuild元素,你应该没问题。