如何在构建后事件中获取版本号
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 应用程序中获取应用程序版本号?