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

15

我希望使用 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个回答

6
这个发布脚本对我很有帮助,每次构建后都会打包和发布我的开发版本。非常简单易懂。
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"

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>

4

请尝试以下操作:

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文章了解更多令牌和信息。
3)在每个放置.csproj.nuspec文件的项目中使用以下Post Build事件(请删除回车键):
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服务器

发行版问题:

如评论所述,有一个问题不允许Nuget.exe在发布模式下生成软件包。

为了解决此问题,请执行以下操作:

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

  1. 项目属性>生成
  2. 在“配置”下拉列表中选择“所有配置”
  3. 在“输出”部分中更改“输出路径:”字段,例如,我当前使用的是“bin \”(不用引号)

1
如果 Configuration 设置为 Debug,这将起作用。但是一旦我将它更改为 Release,那么我就会收到一个异常“Unable to find path\bin\Debug\MyDll.dll”。确保已经构建了该项目。这意味着 nuget 仍在查找 Debug 文件夹而不是 Release。任何想法? - sventevit
1
我也遇到了这个问题。我应该通知Nuget团队。为了解决它,DEBUG和RELEASE文件夹应该是相等的。唯一需要注意的是,在从一种模式切换到另一种模式时,您应该重新生成解决方案。对于每个使用此脚本的项目:
  1. 项目属性>构建
  2. 在“配置”下拉菜单中选择“所有配置”
  3. 在“输出”部分中,更改“输出路径:”字段,例如,我目前正在使用“bin \”(不带引号)
通过这种修复,Nuget.exe将在DEBUG和RELEASE中生成软件包。
- sesispla
1
@sesispla @sventevit 你需要添加一个额外的包设置:-Properties "Configuration=$(Configuration);Platform=$(Platform)",这将允许它在发布时工作而不更改输出目录。 - Andrew Hanlon

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>

我添加了“条件属性”,以便我可以指定何时将其构建到特定位置(在我的情况下创建回滚备份)。此外,“xcopy”给我带来了错误...但正常的“copy”没有。
然后,在我的后期构建事件中,我有类似以下内容的东西:
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元素进行复制,就可以了。


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