【问题标题】:.Net Core 2.0 "Generate Nuget package on build" issue with Post-build events.Net Core 2.0“在构建时生成 Nuget 包”问题与构建后事件
【发布时间】:2018-05-14 13:25:08
【问题描述】:

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

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

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

ping 127.0.0.1 -n 4 > NUL

这使得它几乎可靠(~95%),但我认为这是“穷人”的解决方案。在构建后事件脚本中看起来很荒谬。我已经 reported 这个问题给 VS 团队了。但到目前为止还没有多少 cmets 或解决方案。

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

【问题讨论】:

    标签: visual-studio nuget .net-core nuget-package .net-core-2.0


    【解决方案1】:

    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文件的目标目录设置为Directory.Build.props文件旁边名为nupkgs的文件夹。它还为所有支持它的项目启用“生成包构建”功能(“基于 sdk”的项目,如 .net 标准/.net 核心库),因此您不必在 VS 中设置它或编辑所有项目文件.

    【讨论】:

    • 感谢您的回答。现在我正在测试@patutin 的建议。看起来很有希望。您能否向我解释为什么会这样,正如您所写的那样:“但这是一种脆弱的方法。”?自动导入的项目设置听起来不错。我不是 MSbuild 配置方面的专家。但我当然也会对此进行调查。谢谢。
    • 取决于构建后步骤中的其他内容。包输出路径还应包括符号包(msbuild 文件中的dotnet pack --include-symbols&lt;IncludeSymbols&gt;true&lt;/IncludeSymbols&gt;
    • 好的,试了一下,这很简单,而且效果很好。实际上,我在 UI 上一遍又一遍地设置相同的配置,例如:作者、IconUrl 等。我遇到了 true 的一些问题,它必须在项目文件中设置才能打包XML 文档也是如此。我将所有内容都放入 .props 文件中。有史以来最好的解决方案 :) 谢谢。
    • @MartinUllrich 我面临与GeneratePackageOnBuild 类似的问题,它在我的本地机器上工作,但在VSTS Azure Build 管道中不工作。参考:stackoverflow.com/questions/52783149/…能不能请看同指导
    【解决方案2】:

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

    【讨论】:

    • 感谢链接 看起来很有希望。而且更优雅:) 我会在所有项目中进一步测试它,但希望它能正常工作。
    • 这对我来说是正确的答案。只需在您的 csproj 文件中写入:&lt;Target Name="CopyPackage" AfterTargets="Pack"&gt; &lt;Copy SourceFiles="$(OutputPath)..\$(PackageId).$(PackageVersion).nupkg" DestinationFolder="$(SolutionDir)NuGet\BuildOut\" /&gt; &lt;/Target&gt;
    猜你喜欢
    • 2018-09-08
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2021-12-28
    相关资源
    最近更新 更多