如何对已编译的项目执行“dotnet pack”操作

12

我正在尝试为一个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
根据Microsoft Docs on dotnet pack,默认情况下,'dotnet pack'会先构建项目。如果您想避免此行为,请传递'--no-build'选项。这在连续集成(CI)构建方案中通常非常有用,因为您知道代码以前已经构建过。所以我希望这是可能的,只是我漏掉了一些显而易见的东西。感谢任何帮助。
1个回答

24
这是因为dotnet pack --no-build选项会尝试使用先前构建的输出,但找不到它,因为你构建到了非标准的输出路径,并且打包逻辑需要定位生成到构建输出中的某些资源。 -o选项在packbuild命令中内部不同,但你可以将打包命令更改为:
dotnet pack --no-build --no-restore ..\MySolution.ConsoleApp\MySolution.csproj -o bin\Publish\Nuget\ /p:OutputPath=bin\Publish\

这将使用存储在bin\Publish目录中的输出,并将其放入bin\Publish\Nuget\中的Nuget输出目录


我差不多就到那儿了 - 我只是想覆盖MSBuild内部参数,就像你评论中提到的那样 - 感谢你的回答! - Joe van de Bilt
--no-build 也会隐式地设置 --no-restore(根据文档)。 - Alex 75
1
是的,这个问题在2.1/2.2中已经“修复”了,请注意,这个问题最初是关于2.0的,而2.0还没有做到这一点-https://github.com/dotnet/cli/pull/8100(这就是为什么我故意在答案中列出了两者)。 - Martin Ullrich
你好。我尝试了这个解决方案,它在特定的点上起作用了,但是Nuget包的内容全部混乱,并且并没有包含所有的依赖项。有人知道为什么吗?或者我应该如何做才能包含\Publish文件夹的确切内容和结构? - Marius Popa
NuGet包使用dotnet pack命令只包含自身的构建输出,而不包括任何依赖项(这些依赖项作为NuGet依赖项包含在内,因此您会得到每个csproj的.nupkg文件)。如果您正在构建工具,则可以构建工具包 教程文档 - Martin Ullrich

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