.Net Core 2.0 "Generate Nuget package on build" 问题 Post-build 事件

.Net Core 2.0 "Generate Nuget package on build" issue with Post-build events

新的 .NET Core 2.0 项目提供了从项目输出创建 Nuget 包的简单方便的方法。只需单击 "Generate Nuget package on build" 复选框即可。 它工作正常,但我对 Post-build 事件有疑问。 我想在每次构建后将解决方案中的所有包复制到特定文件夹。所以我使用带有脚本的“Post-构建事件命令行”:

xcopy "$(ProjectDir)$(OutDir)..*.nupkg" "$(SolutionDir)..\WebServicePracticesNuget\" /Y /I

有时它工作正常有时根本不工作。到目前为止,我的调查得出结论,Nuget 包创建不是构建过程本身的一部分。所以脚本(有时)会在包生成之前触发,这是不可预测的。我的解决方案是增加一些延迟。不幸的是,“timeout x”不适用于 Post-build 事件。所以我使用了后备选项:

ping 127.0.0.1 -n 4 > NUL

这使得它几乎可靠 (~95%),但我认为它是 "poor man's" 解决方案。在 Post-build 事件脚本中看起来很荒谬。我已经 reported 将这个问题提交给 VS 团队。但到目前为止没有太多评论或解决方案。

所以我的问题是:有人遇到同样的问题吗?或者我现在有更好的解决方案的想法吗? 谢谢。

您可以在项目文件中配置msbuild task order

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

打包目标将遵循 PackageOutputPath msbuild 属性,这是 dotnet pack--output 参数设置的内容。

由于 xcopy 仅适用于 windows,最通用的解决方案是在构建过程中使用 msbuild 设置 属性。

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

<Project>
  <PropertyGroup>
    <PackageOutputPath>$(MSBuildThisFileDirectory)nupkgs</PackageOutputPath>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
  </PropertyGroup>
</Project>

此文件将自动导入到目录层次结构中的所有项目文件中,打开此文件并将生成的 .nupkg 文件的目标目录设置为 [= 旁边名为 nupkgs 的文件夹21=] 文件。它还为支持它的所有项目("sdk-based" 项目,如 .net 标准/.net 核心库)启用 "generate package build" 功能,因此您不必在 VS 中设置它或编辑所有项目文件.