新的.NET Core 2.0项目提供了从项目输出中创建Nuget Package的简便方法。只需单击“在构建时生成Nuget包”复选框即可完成。 它工作正常,但我有一个构建后事件的问题。 我想在每次构建后将解决方案中的所有包复制到特定文件夹。所以我使用“构建后事件命令行”和脚本:
xcopy "$(ProjectDir)$(OutDir)..*.nupkg" "$(SolutionDir)..\WebServicePracticesNuget\" /Y /I
有时它工作得很好,有时根本没有。到目前为止,我的调查得出结论,Nuget包创建不是构建过程本身的一部分。因此,脚本(有时)将在生成包之前触发,并且是不可预测的。我的解决方案是增加一些延迟。不幸的是,“超时x ”无法使用Post-build事件。所以我使用了后备选项:
ping 127.0.0.1 -n 4 > NUL
这使它几乎可靠(~95%),但我认为这是“穷人”的解决方案。在Post-build事件脚本中看起来很荒谬。我已经向VS团队reported发了这个问题。但到目前为止没有太多评论或解决方案。
所以我的问题是:有没有人有同样的问题?或者我现在有什么想要更好的解决方案? 感谢。
答案 0 :(得分:7)
GeneratePackageOnBuild
功能在Pack
之后执行Build
目标,因此可以在创建NuGet包之前运行post build事件。在VS 15.3+中,当您创建构建后事件时,它将在项目文件中创建Target
元素。您可以将AfterTargets
属性更改为AfterTargets="Pack"
以在打包后运行,而不是在核心.net构建之后运行。但这有点脆弱。
包目标将尊重PackageOutputPath
msbuild属性,这是dotnet pack
的{{1}}参数设置的内容。
由于--output
仅适用于Windows,因此最通用的解决方案是使用msbuild在构建期间设置属性。
例如,您可以在解决方案文件(所有项目上方的目录)旁边放置一个xcopy
文件,其中包含以下内容:
Directory.Build.props
此文件将自动导入到目录层次结构中的所有项目文件中,并将生成的<Project>
<PropertyGroup>
<PackageOutputPath>$(MSBuildThisFileDirectory)nupkgs</PackageOutputPath>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
</PropertyGroup>
</Project>
文件的目标目录设置为.nupkg
旁边的nupkgs
文件夹文件。它还支持所有支持它的项目的“生成包构建”功能(“基于sdk”项目,如.net标准/ .net核心库),因此您不必在VS中设置它或编辑所有项目文件。
答案 1 :(得分:3)
您可以在项目文件中配置msbuild task order。