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

Posted

技术标签:

【中文标题】如何在构建后事件中获取版本号【英文标题】:How to get version number in post-build event 【发布时间】:2011-11-21 03:29:20 【问题描述】:

我想使用构建后事件自动创建一个 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) 变量不存在...有什么想法吗?

【问题讨论】:

Determine Assembly Version during a Post Build Event?的可能重复 【参考方案1】:

这个帖子构建脚本对我有用。它在每个构建中打包并发布我的开发版本。很简单。

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"

【讨论】:

【参考方案2】:

尝试以下方法:

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 文件的每个项目中使用以下构建后事件(请删除 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 和构建后事件命令如下所示:

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。 (自动,每次构建)

你就完成了!现在在

中更改程序集和文件版本

项目 > 属性 > 装配信息

重要提示:如果您设置了 $author$ 和/或 $description$ 令牌,请在此处填写大会的公司和说明字段。如果遇到问题,请删除 $author$ 和/或 $description$ 标记并尝试重新编译。

并构建您的项目,您将在 /GeneratedPackages 文件夹中看到带有您在项目属性中设置的版本的 MyLib.X.X.X.X.nupack。如果你设置了依赖,你会看到它已经被自动包含为包依赖。

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

您也可以使用

来完成构建后事件
nuget push

将生成的包发送到 Nuget 服务器

发布中的问题:

如 cmets 中所述,存在不允许 Nuget.exe 在 RELEASE 模式下生成包的问题。

这样做是为了修复它:

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

    项目属性>构建 在“配置”下拉菜单中选择“所有配置” 在“Ouput”​​部分,更改“Output path:”字段,例如我目前使用的是“bin\”(不带cuotes)

【讨论】:

如果配置设置为调试,则此方法有效。但是一旦我将它更改为 Release,我就会得到一个异常“无法找到 path\bin\Debug\MyDll.dll”。确保项目已经构建。这意味着,该 nuget 仍在查找 Debug 文件夹而不是 Release。有什么想法吗? 我也发现了这个问题。我应该通知 Nuget 团队。要修复它,DEBUG 和 RELEASE 文件夹应该相等。唯一需要注意的是,当您从一种模式切换到另一种模式时,您应该使用 Rebuild 解决方案。对于使用此脚本的每个项目: 1. 项目属性 > 构建 2. 在“配置”下拉列表中选择“所有配置” 3. 在“输出”部分中,更改“输出路径:”字段,例如,我目前使用“bin\”(不带 cuotes)通过此修复,Nuget.exe 将在 DEBUG 和 RELEASE 中生成 de 包 @sesispla @sventevit 您需要添加一个额外的包设置:-Properties "Configuration=$(Configuration);Platform=$(Platform)" 这将允许它在不更改输出目录的情况下在发布中工作。【参考方案3】:

我尝试了 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>

我添加了“条件”属性,以便我可以指定何时将其构建到特定位置(在我的情况下为回滚创建备份)。此外,“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 包“$(SolutionDir)MyLib.nuspec” 并为副本添加 afterbuild 元素,你应该没问题。

【讨论】:

【参考方案4】:

试试这个:

编辑您的 .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>

【讨论】:

以上是关于如何在构建后事件中获取版本号的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS PhoneGap 应用程序中获取应用程序版本号?

如何在 shell 命令中发送 Jenkins 版本号作为参数,该命令将在构建结束后执行

如何获取 Flutter 应用的构建和版本号

更改 Jenkins 内部版本号

如何从二进制文件中获取应用程序的版本号?

如何获取我的 Android 应用程序的内部版本号? [复制]