如何使用 NuGet 打包命令行工具?

Dan*_* VH 8 c# package nuget tooling

这是一个用例。不确定 NuGet 是否最初是为此创建的,所以我可以想象共识是我不应该做我想做的事情。

目标:

将简单的控制台应用程序打包并分发为其他项目的工具。我希望它们可以从命令提示符运行。类似于 Nunit 的控制台运行程序 (nunit-console.exe)。

我使用C#定位net461netcore2

问题:

我将参考我的工具应用程序,它的包为MyAppMyPkg

  1. 您能否确认约定是 MyApp 二进制文件应放入toolsNuGet 包中的文件夹中?
  2. 我添加到MyApp 的任何依赖项(例如 CommandLineArgumentsParser),它们都将作为引用/依赖项出现在依赖项目中。我希望他们没有 - 可以预防吗?
  3. MyApp二进制dll文件旁边的 bin 文件夹中还有其他依赖项。它们是来自其他包的 dll。将它们也包含在我的包中是否是一个好习惯?
  4. 如果我指定为依赖于包X MYPKG,包装X将安装取决于项目MYPKG。可以以某种方式引用 X 的 DLL 以便我不必用MyApp打包它们吗?

我希望我的问题很清楚。如果我写的内容对您没有意义,请要求澄清 - 不要指望您是读心者:)

此外,如果您有任何我可以阅读的解决该主题的在线资源,我将非常乐意阅读它们。

谢谢!

wal*_*rlv 7

直接回答

1.你能确认约定是MyApp二进制文件应该放在NuGet包的tools文件夹中吗?

是的,建议将命令行二进制文件放入tools文件夹中。

请参阅 NuGet 官方文档:如何创建 NuGet 包 - Microsoft Docs。对于tools文件夹,它说:

可从包管理器控制台访问的 Powershell 脚本和程序。

工具文件夹仅添加到包管理器控制台的 PATH 环境变量中(具体来说,不会添加到构建项目时为 MSBuild 设置的 PATH 中)。

2.无论我向 MyApp 添加什么依赖项(例如 CommandLineArgumentsParser),它们都会在依赖项中显示为引用/依赖项。我希望他们没有 - 可以预防吗?

您应该添加PrivateAssets="All"以防止您的包依赖项转换为 NuGet 依赖项。

请参阅 NuGet 官方文档:NuGet PackageReference 格式(项目文件中的包引用)| 微软文档。只需将此代码添加到您不想被目标项目引用的任何依赖项即可。

<PackageReference Include="CommandLineArgumentsParser" Version="3.0.18" PriavateAssets="All">
Run Code Online (Sandbox Code Playgroud)

如果您的所有依赖项不应转换为包依赖项,请将此行添加到所有PackageReference节点的末尾:

<PackageReference Update="@(PackageReference)" PrivateAssets="All" />
Run Code Online (Sandbox Code Playgroud)

3.在MyApp二进制文件旁边的bin文件夹中还有其他依赖dll。它们是来自其他包的 dll。将它们也包含在我的包中是否是一个好习惯?

NuGet 没有为我们提供自动解析依赖项的能力,因此我们也应该将我们的依赖项 dll 放入我们的工具文件夹中。如果您想知道如何添加依赖项,请阅读 Nate McMaster 的帖子以了解:具有依赖项的 MSBuild 任务

4.如果我指定包X作为对MyPkg的依赖,包X将根据MyPkg为项目安装。可以以某种方式引用 X 的 DLL 以便我不必用 MyApp 打包它们吗?

这个问题与第二个问题相同,只需按照第二个答案进行即可。

其他参考资料

我写了这样一篇文章来帮助我们用 NuGet 打包命令行工具,但它不是英文的。我很高兴今天把它翻译成英文,这样你就可以阅读学习了。

这是临时的谷歌翻译版本,我会尽快将其翻译成英文并张贴在这里。

这些是更多文章供您学习 NuGet 打包技巧。它们不会直接回答您的问题,但它们仍然很有用: