.Net Core 2.0"在构建时生成Nuget包"问题与构建后事件

Maj*_*jor 8 visual-studio nuget nuget-package .net-core .net-core-2.0

新的.NET Core 2.0项目提供了从项目输出创建Nuget Package的简便方法.只需单击"在构建时生成Nuget包"复选框即可完成. 在此输入图像描述 它工作正常,但我有一个构建后事件的问题.我想在每次构建后将解决方案中的所有包复制到特定文件夹.所以我使用脚本的" Post-build event命令行 ":

xcopy "$(ProjectDir)$(OutDir)..*.nupkg" "$(SolutionDir)..\WebServicePracticesNuget\" /Y /I
Run Code Online (Sandbox Code Playgroud)

有时它工作得很好,有时根本没有.到目前为止,我的调查得出结论,Nuget包创建不是构建过程本身的一部分.因此,脚本(有时)将在生成包之前触发,并且是不可预测的.我的解决方案是增加一些延迟.不幸的是," 超时x "不适用于构建后事件.所以我使用了后备选项:

ping 127.0.0.1 -n 4 > NUL
Run Code Online (Sandbox Code Playgroud)

这使得它几乎可靠(~95%),但我认为这是"穷人"的解决方案.在Post-build事件脚本中看起来很荒谬.我已经向VS团队报告了这个问题.但到目前为止没有太多评论或解决方案.

所以我的问题是:有没有人有同样的问题?或者我现在有什么想要更好的解决方案?谢谢.

Mar*_*ich 10

GeneratePackageOnBuild功能在执行Pack目标之后执行目标,Build因此在创建NuGet包之前可能会运行post build事件.在VS 15.3+中,当您创建后构建事件时,它将Target在项目文件中创建一个元素.您可以将其AfterTargets上的属性更改为AfterTargets="Pack"在打包后运行,而不是在核心.net构建之后运行.但这是一个脆弱的方法.

该组目标将尊重PackageOutputPathMSBuild的属性,它是什么dotnet pack--output参数设置会.

由于xcopy仅适用于Windows,因此最通用的解决方案是使用msbuild在构建期间设置属性.

例如,您可以将Directory.Build.props文件放在解决方案文件(所有项目上方的目录)旁边,其中包含以下内容:

<Project>
  <PropertyGroup>
    <PackageOutputPath>$(MSBuildThisFileDirectory)nupkgs</PackageOutputPath>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
  </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

此文件将自动导入到目录层次结构中的所有项目文件中,并将生成的.nupkg文件的目标目录设置为文件nupkgs旁边的Directory.Build.props文件夹.它还支持所有支持它的项目的"生成包构建"功能("基于sdk"项目,如.net标准/ .net核心库),因此您不必在VS中设置它或编辑所有项目文件.


Rom*_*tin 6

您可以在项目文件中配置msbuild任务顺序

  • 这对我来说是正确的答案。只需在您的csproj文件中输入以下内容:`&lt;目标名称=“ CopyPackage” AfterTargets =“ Pack”&gt; &lt;复制SourceFiles =“ $(OutputPath).. \ $(PackageId)。$(PackageVersion).nupkg” DestinationFolder =“ $ (SolutionDir)NuGet \ BuildOut \“ /&gt; &lt;/ Target&gt;` (2认同)