.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 中设置它或编辑所有项目文件.
新的 .NET Core 2.0 项目提供了从项目输出创建 Nuget 包的简单方便的方法。只需单击 "Generate Nuget package on build" 复选框即可。
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 中设置它或编辑所有项目文件.