在构建后事件上更新本地nuget包

我的本地nuget库存储库分别用于我的个人和工作相关的类库。

我已经为不再开发的库创建了一些nuget包。 我只为他们这样做,因为我不知道如何在项目构建后自动更新它们。

我认为所有的工作都是由nuget命令行和Visual Studio命令提示符完成的。 所以我可以轻松地完成我需要的工作(当然,我会完全了解命令而不是!)

基本上我希望在项目的post-build事件上执行以下任务。

在项目构建上:

  1. 将项目dll复制到特定文件夹(nuget包的lib文件夹)
  2. 更新nuspec文件以获取新文件版本(我的项目正在增加每个版本的文件版本)
  3. 使用新文件版本创建新的nupkg文件

Phil Haack展示了这个function,但据我所知,它仍然是原型。

所以我的要求是上面的。 有没有其他人完成这个?

杰里米·斯金纳(Jeremy Skinner)撰写了一篇关于他如何执行自动化软件包构建并将其上传到NuGet Gallery 的博客文章 。 我认为它符合您的要求。

基本上他使用MsBuild将版本(带有MsBuild社区扩展 UpdateXml任务)应用于nuspec文件并调用nuget.exe将其打包。

选择的解决方案看起来会起作用,但似乎有一个更简单的解决方案可满足您的要求。

您可以创建一个nuspec文件,该文件将从项目的元数据中读取数据。 您只需使用此命令执行此操作一次:

C:\\nuget spec 

这会在spec文件中创建“标记”,在创建nuget包时,这些标记将被项目的元数据替换。 这包括文件版本。 您将需要替换,因为所有项目在技术上都假设拥有它们。

更多细节可以在这里找到: http : //docs.nuget.org/docs/creating-packages/Creating-and-Publishing-a-Package#From_a_project

然后…

对于.Net Framework(旧学校)项目 ,在项目的Post构建事件中,您可以执行以下操作:

 nuget pack "$(ProjectPath)" xcopy "$(TargetDir)*.nupkg" "" /C /Y 

(假设您的系统PATH上有nuget.exe)。

对于.Net Core和Standard项目 ,nuget无法打包它们(请参阅https://github.com/NuGet/Home/issues/4491 )。 相反,使用此作为您的构建后步骤:

dotnet pack "$(ProjectPath)" --no-build --include-source --include-symbols --output ""

当然,您可以调整选项以满足您的需求。 有关dotnet pack命令选项,请参阅https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-pack?tabs=netcore2x 。

以防其他人(像我一样)遇到这个古老的问题 – 在当前时代(VS2017,SDK / NugetReference格式/ .NET核心/ .NET标准/多目标项目),创建NuGet包是一个选项项目属性 – 因此,只需要解决本地存储库的问题:

如果您有单目标项目,要将.nupkg文件复制到本地NuGet存储库,请添加Post-build事件(项目属性>构建事件>构建后事件命令行):

xcopy $(TargetDir)*。nupkg [本地nuget存储库的路径] / s

喜欢:

xcopy $(TargetDir)*。nupkg G:\ imbVelesOpenSource \ LocalNuGet \ imbVelesSecondGeneration \ / s


如果您有多目标项目,则将.nupkg文件复制到本地NuGet存储库:添加构建后事件(项目属性>构建事件>构建后事件命令行):

xcopy $(TargetDir).. *。nupkg [本地nuget存储库的路径] / s

喜欢:

xcopy $(TargetDir).. *。nupkg G:\ imbVelesOpenSource \ LocalNuGet \ imbVelesSecondGeneration \ / s


更新:忘记构建后事件,有一种更简洁的方法(xcopy方法对于多目标项目很奇怪),只需在项目XML中添加:

     

我最近发布了一个解决方案,它实际上在构建期间创建/更新nuspec文件,因此不必手动执行,然后创建nupkg文件。

您需要添加的只是一个构建后事件,用于将程序包复制到目标(或将其作为可选阶段添加到我的解决方案中)。

你可以在这里找到一篇带有演练指南的文章和源代码+二进制文章 。