如何“dotnet pack”一个已经编译好的项目

Joe*_*ilt 6 .net msbuild nuget .net-core dotnet-cli

我正在尝试为执行以下操作的 dotnet core 2.0 项目设计构建脚本

  1. 清理输出目录
  2. 使用 -o bin\Publish 构建解决方案
  3. 使用 dotnet vstest 运行单元测试
  4. 使用 dotnet pack 创建 Nuget 包

因为我知道源代码已经在步骤 1-3 中构建和测试,我不想为 nuget 包重建我的代码,所以我指定 --no-build 和 --no-restore

我遇到的困难是在创建包时,因为我没有构建并且输出目录设置为 bin\Publish - pack 命令正在寻找 bin\Debug 目录中的项目。

有没有办法可以设置 dotnet pack 命令以了解在哪里查找已编译的对象?

这是我的构建脚本示例

dotnet clean ..\MySolution.sln -o bin/Publish/
dotnet build ..\MySolution.sln /p:Configuration=Release -o bin/Publish/
dotnet vstest ..\MySolution.UnitTests\bin\Publish\MySolution.UnitTests.dll
dotnet pack --no-build --no-restore ..\MySolution.ConsoleApp\MySolution.csproj -o bin\Publish\Nuget\

....

error : The file 'D:\MySolution.ConsoleApp\bin\Debug\netcoreapp2.0\MySolution.ConsoleApp.runtimeconfig.json' to be packed was not found on disk
Run Code Online (Sandbox Code Playgroud)

根据dotnet pack 上Microsoft Docs

“默认情况下,dotnet pack 首先构建项目。如果您希望避免这种行为,请传递 --no-build 选项。这在您知道代码之前已构建的持续集成 (CI) 构建方案中通常很有用。”

所以我希望这是可能的,但我遗漏了一些明显的东西。任何帮助,将不胜感激。

Mar*_*ich 15

这样做的原因是该dotnet pack --no-build选项将尝试使用先前构建的输出,但无法找到它,因为您构建到非标准输出路径并且打包逻辑需要定位生成到构建输出中的一些资产。

和命令的-o选项在内部是不同的packbuild但您可以将 pack 命令更改为:

dotnet pack --no-build --no-restore ..\MySolution.ConsoleApp\MySolution.csproj -o bin\Publish\Nuget\ /p:OutputPath=bin\Publish\
Run Code Online (Sandbox Code Playgroud)

这将使用内置到bin\Publish目录中的输出并将其放入 Nuget 输出目录中bin\Publish\Nuget\