在Nuget的后期构建中获取版本

5

代码:

if $(ConfigurationName) == Release (
    cd $(ProjectDir)
    nuget spec Entities -f
    nuget pack DeusPak.Entities.csproj -Prop Configuration=Release
    nuget push DeusPak.Entities.$(version).nupkg  $(MYGET_API_KEY) -Source     http://www.myget.org/F/lojaali/api/v2/package
)

我刚开始使用NuGet,并想知道如何在我的NuGet包中包含版本号。目前,我正在将其硬编码到后期构建事件中,这显然不是我想要一直做的事情。有人能帮忙吗?
这是我的当前后期构建事件:
if $(ConfigurationName) == Release (
    cd $(ProjectDir)
    nuget spec Dev-f
    nuget pack Dev.csproj -Prop Configuration=Release
    nuget push Dev.1.0.0.0.nupkg  $(MYGET_API_KEY) -Source     http://www.myget.org/F/api/v2/package
)

更新:

好的,我已经成功构建了具有正确自动增量版本号的DLL:

if $(ConfigurationName) == Release (
    cd $(ProjectDir)
    nuget spec Dev -f
    nuget pack Dev.csproj -Prop Configuration=Release
    nuget push Dev.$(version).nupkg  $(MYGET_API_KEY) -Source     http://www.myget.org/F/api/v2/package
)

但是这个版本没有显示在我的 MyGet 包列表中。如何让它显示出来以便下载?或者只能通过手动点击“添加包”来完成吗?

命令看起来没问题。在将 pkg 推送到 MyGet feed 并使其可用之间可能会有一些小延迟。不过这应该不会超过几分钟。此外,请记住,如果您推送了一个预发布包(例如 1.0.0-alpha),则必须在 NuGet Package Manager 控制台中使用 -IncludePrerelease 开关,或者在通过 VSIX UI 对话框浏览您的 feed 时选择 IncludePrerelease 选项。您确定 pkg 成功推送了吗(没有日志)? - Xavier Decoster
3个回答

7

我稍微扩展了Carlos J López提供的解决方案,我使用了AfterBuild脚本来实际调用NuGet并提供版本参数。

在我的情况下,我还添加了“cd $(ProjectDir)”到后期构建事件中,这实际上是在AfterBuild脚本之前发生的。

干杯!

    <Target Name="AfterBuild" Condition="'$(Configuration)' == 'Release'">
      <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
          <Output TaskParameter="Assemblies" ItemName="AssemblyVersion" />
      </GetAssemblyIdentity>
      <Exec Command="$(SolutionDir)\.nuget\nuget pack $(ProjectName).nuspec -Version %(AssemblyVersion.Version)" />
      <Message Text="$(SolutionDir)\.nuget\nuget pack $(ProjectName).nuspec -Version %(AssemblyVersion.Version)" Importance="high" />
    </Target>  

你是说你正在执行AfterBuild目标和PostBuild事件吗?那么这样做的目的是什么?难道你不能在AfterBuild中执行另一个命令吗? - crush

6

在你的问题中并不清楚,但是假设你想要将包的版本与程序集的版本同步,你可以简单地管理项目的AssemblyInfo.cs文件中的AssemblyVersion属性。

[assembly: AssemblyVersion("1.0.0")]

或者,如果您想使用自动生成的构建号

[assembly: AssemblyVersion("1.0.0.*")]

如果您想从程序集的版本中偏离,并且只指定包版本,您可以在AssemblyInfo.cs文件中使用AssemblyInformationalVersion属性。
[assembly: AssemblyInformationalVersion("1.0.0")]

从问题中也不清楚您使用的版本控制策略,但我会假设您想应用语义化版本控制(其中前3个版本号最相关)。通常,在自动创建NuGet包时,我建议您在csproj目录中创建一个标记化nuspec文件,以便更轻松地操作包元数据。顺便说一下,甚至有一个NuGet包可帮助您完成这项工作:

Install-Package NuSpec 

当 NuGet 针对 MyProject.csproj 进行操作时,会寻找名为 MyProject.nuspec 的文件。请确保该文件存在。
<package>
  <version>$version$</version>
  ...
</package>

我也在MyGet博客上解释了这个问题,在这篇文章中:http://blog.myget.org/post/2012/04/27/NuGet-version-token-explained.aspx

假设你只是在构建之前更改程序集版本,那么调用nuget pack的后期构建应该就足够了。

nuget pack MyProject.csproj

嗨,我不想每次都手动更改我的后置生成程序集版本,我希望能够传递令牌来自动获取版本号。所以这是我想要更改的行,但我不确定语法:nuget push Dev.1.0.0.0.nupkg $(MYGET_API_KEY) -Source http://www.myget.org/F/api/v2/package - user517406
即使我添加了三位数字的版本(例如您的示例“1.0.0”),NuGet仍会生成以1.0.0.0.nupkg结尾的文件。也许我漏掉了什么?我的AssemblyInfo文件只有AssemblyVersionAssemblyFileVersion属性,它们的值都相同,为“1.0.0”。 - julealgon

4
这是如何在构建后事件中获取$(version)变量的方法,应该与构建后一样有效。
<Target Name="AfterBuild" Condition="'$(Configuration)' == 'Release'">
    <GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
        <Output TaskParameter="Assemblies" ItemName="AssemblyVersion" />
    </GetAssemblyIdentity>
    <Exec Command="echo %(AssemblyVersion.Version)" />
    <Message Text="Released %(AssemblyVersion.Version)" Importance="high" />
</Target>

所以你需要修改你的.csproj文件,因为Visual Studio没有提供相应的用户界面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接