使用VS2017自动生成一个NuGet包并发布

13

在Visual Studio 2017中,新增了一项功能,可以在构建某些目标类型(特别是我正在使用的.NET Standard 2.0)时生成NuGet包。

这个功能非常好用,成功构建后会生成.nupkg文件。

然而,我不知道如何将构建好的NuGet包自动发布到我们的本地存储库。

我已经尝试过在构建后运行以下后置事件:

nuget push -Source https://my.nuget.server/nuget/ "C:\Source\MyProject\bin\Release\MyProject.1.0.0.nupkg"

但这会带来两个问题:

  1. 软件包的名称包括版本号,而此版本号无法作为构建后事件变量使用,因此我不能像这样说:nuget push $(NugetPackage)。我也无法找到可有效获取软件包名称的宏/变量组合。
  2. 自动 NuGet 打包过程发生在构建后事件之后,因此在构建后事件时,软件包甚至还没有生成!

Microsoft 提供了这个强大的自动 NuGet 打包功能,但似乎没有办法将其推送到本地存储库!

有人成功实现了这个功能吗?我有什么遗漏的地方吗?有解决方法吗?这是正在处理的事情吗?

2个回答

15

您可以通过在库的csproj中直接添加以下行来自动化发布至nuget。您需要将环境变量设置为nuget.exe的位置,将该位置添加到系统的PATH中,或将其硬编码输入到Command参数中。

个人而言,我更喜欢下载最新版本的nuget.exe并将其放置在用户的%userprofile%\.nuget文件夹中。这是nuget存储软件包本地缓存的位置,因此它应该已经创建好了。

将代码发布到远程仓库的示例。

<Target Name="PostPackNugetDeploy" AfterTargets="Pack" Condition="'$(Configuration)' == 'Release'">
  <Exec Command="="%userprofile%\.nuget\nuget.exe push &quot;$(OutputPath)$(PackageId).$(PackageVersion).nupkg&quot; -Source &quot;$(NuGetSourceRelease)&quot; -Verbosity Detailed" />
</Target>

发布到本地仓库的示例。

<Target Name="PostPackNugetDeploy" AfterTargets="Pack" Condition="'$(Configuration)' == 'Release'">
 <Exec Command="%userprofile%\.nuget\nuget.exe add &quot;$(OutputPath)$(PackageId).$(PackageVersion).nupkg&quot; -source \\Server\Packages" />
</Target>

您可以在此处找到有关NuGet MSBuild目标的文档:https://learn.microsoft.com/en-us/nuget/reference/msbuild-targets

更新

我已将其封装为一个NuGet包,可以在您的项目中引用。它会处理所有这些问题,您所需要做的就是向您的项目添加一个属性。

您可以在此处找到代码和完整指南。
https://github.com/SimplerSoftware/SS.NuGet.Publish


对我有用,但我使用了“复制”命令而不是“执行”命令:<Copy SourceFiles =“$(OutputPath) ..\ $(PackageId).$(PackageVersion).nupkg” DestinationFolder =“\ networkshare \ folder” /> - birwin
3
它并不会将其发布,而是复制文件。如果您发布它,它将创建版本控制的文件夹结构。 - John C
谢谢你的提示。我是nuget的新手,所以我会尝试“add”命令进行比较。 - birwin
约翰是正确的。将其更改为exec nuget后,Nuget Feed存储库中出现了代表版本的文件夹、sha文件和nuspec文件。 - birwin

3

这个功能在这里被请求:启用从VS推送

NuGet发布通常使用构建/部署自动化软件来处理,例如TFS、VSTS、Jenkins等。


1
谢谢 - 我已经添加了一条评论来跟踪该功能请求。似乎还有其他人需要这个功能 - 并非每个人都拥有完整的ALM设置,我们中的一些人喜欢直接从VS发布,因为它快速且无摩擦。 :) - qJake

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