.Net Core 2.0的“生成Nuget包”问题与后置构建事件

12
新的.NET Core 2.0项目提供了一种简单方便的方式,可以从项目输出中创建Nuget包。只需勾选“生成Nuget包并构建”复选框即可完成。 enter image description here 这个很好用,但我在后期构建事件中遇到了问题。 我想在每次构建后将解决方案中的所有包复制到特定文件夹中。因此,我使用“后期构建事件命令行”和一个脚本:
xcopy "$(ProjectDir)$(OutDir)..*.nupkg" "$(SolutionDir)..\WebServicePracticesNuget\" /Y /I

有时候它工作得很好,有时候根本就不行。到目前为止,我的调查结论是Nuget包的创建并不是构建过程本身的一部分。因此,脚本有时会在生成包之前触发,这是不可预测的。我的解决方案是添加一些延迟。不幸的是,“timeout x”在后置事件中无法工作。因此,我使用了备选方案:

ping 127.0.0.1 -n 4 > NUL

这使其几乎可靠(约95%),但我认为这是“穷人的”解决方案。在后构建事件脚本中看起来很荒谬。我已经向VS团队报告了此问题,但迄今没有太多评论或解决方案。

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

2个回答

17
GeneratePackageOnBuild 特性在 Build 之后执行 Pack 目标,因此在创建 NuGet 包之前可能会运行后生成事件。在 VS 15.3+ 中,创建后生成事件时,它将在项目文件中创建一个 Target 元素。您可以将其上的 AfterTargets 属性更改为 AfterTargets="Pack",以在打包后而不是在 .net 构建后运行。但这种方法有点脆弱。 Pack 目标将尊重 PackageOutputPath msbuild 属性,这是 dotnet pack--output 参数设置的内容。
由于 xcopy 仅适用于 Windows,最通用的解决方案是使用 msbuild 在构建过程中设置该属性。
例如,您可以在解决方案文件旁边(所有项目之上的目录)放置一个 Directory.Build.props 文件,并填写以下内容:
<Project>
  <PropertyGroup>
    <PackageOutputPath>$(MSBuildThisFileDirectory)nupkgs</PackageOutputPath>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
  </PropertyGroup>
</Project>

此文件将自动导入到此文件下方目录层次结构中的所有项目文件中,并将生成的.nupkg文件的目标目录设置为名为nupkgs的文件夹,位于Directory.Build.props文件旁边。 它还为支持“sdk-based”项目(如.net standard / .net core库)的所有项目启用了“生成包构建”功能,因此您无需在VS中设置它或编辑所有项目文件。


谢谢你的回答。现在我正在测试@patutin的建议。看起来很有前途。你能解释一下为什么像你所写的那样:“但这是一个有点脆弱的方法”吗? 自动导入项目设置听起来不错。我不是MSbuild配置方面的专家。但我肯定也会研究一下。谢谢。 - Major
取决于后续构建步骤中还有什么内容。软件包输出路径还应包括符号软件包(在msbuild文件中使用dotnet pack --include-symbols<IncludeSymbols>true</IncludeSymbols>)。 - Martin Ullrich
好的,我试了一下,这很容易,而且非常有效。实际上,我曾经在UI上反复设置相同的配置,例如:作者、IconUrl等等。而且我还遇到了一些问题,<PublishDocumentationFile>true</PublishDocumentationFile>必须在项目文件中设置,才能将XML文档打包。我把所有东西都放到了.props文件中。这是最好的解决方案:)谢谢。 - Major
@MartinUllrich,我遇到了与“GeneratePackageOnBuild”类似的问题,在我的本地机器上可以工作,但在VSTS Azure Build管道中无法工作。参考:https://stackoverflow.com/questions/52783149/building-nuget-package-with-nuget-pack-csproj-and-nuget-push-created-package您能否请看一下并指导一下? - Mrunal

8

1
谢谢提供链接,<Target Name="CopyPackage" AfterTargets="Pack"> 看起来非常有前途。而且更加优雅 :) 我会用所有的项目进一步测试它,但希望它能正常工作。 - Major
3
对我来说,这是正确的答案。只需在您的 csproj 文件中写入以下内容: 即可。 - psulek

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