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

tug*_*erk 12 c# asp.net post-build-event visual-studio nuget

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

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

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

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

在项目构建上:

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

Phil Haack展示了这个功能,但据我所知,它仍然是一个原型.

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

jst*_*ant 11

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

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

C:\<Path to project>\nuget spec
Run Code Online (Sandbox Code Playgroud)

这会在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" "<path where you are hosting your local nuget repo>" /C /Y
Run Code Online (Sandbox Code Playgroud)

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

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

dotnet pack "$(ProjectPath)" --no-build --include-source --include-symbols --output "<path where you are hosting your local nuget repo>"

当然,您可以调整选项以满足您的需求.见https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-pack?tabs=netcore2xdotnet pack命令选项.

  • 如果要设置输出目录,也可以避免两步过程.此外,您可能需要考虑是否需要包含依赖项:nuget pack"$(ProjectPath)" - outputdirectory"c:\ NuGetPackages"-IncludeReferencedProjects (6认同)

har*_*les 7

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

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

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 中添加:

  <Target Name="CopyPackage" AfterTargets="Pack">
    <Copy SourceFiles="$(OutputPath)$(PackageId).$(PackageVersion).nupkg" DestinationFolder="G:\imbVelesOpenSource\LocalNuGet\imbVelesSecondGeneration\" />
  </Target>
Run Code Online (Sandbox Code Playgroud)

  • 必须将我的目标修改为 &lt;Target Name="CopyPackage" AfterTargets="Pack"&gt; &lt;Copy SourceFiles="$(ProjectDir)\bin\Release\$(PackageId).$(PackageVersion).nupkg" DestinationFolder="C :\Users\mcasas\Documents" /&gt; &lt;/Target&gt; (3认同)

PHe*_*erg 6

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

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