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

11

以下是一种使用案例。不确定NuGet最初是否为此创建,因此我可以想象共识将是我不应该做我想做的事情。

目标:

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

我使用C#针对net461netcore2

问题:

我将引用我的工具应用程序及其包装为MyAppMyPkg

  1. 您能确认约定是MyApp二进制文件应放入NuGet包中的tools文件夹吗?
  2. 无论我添加到MyApp中的依赖项(如CommandLineArgumentsParser),它们都会显示在依赖项目中作为引用/依赖项。 我希望它们不会-有什么方法可以防止这种情况发生吗?
  3. MyApp二进制文件旁边的bin文件夹中还有其他依赖项dll。 它们是来自其他包的dll。 将它们也包含在我的包中是一个好习惯吗?
  4. 如果我将包X指定为MyPkg的依赖项,则包X将安装到依赖于MyPkg的项目中。 是否可以以某种方式引用X的DLL,以便我不必将它们与MyApp打包在一起?
我希望我的问题表述清晰。如果我的写作不太容易理解,请询问澄清 - 不要期望您是心灵读者:)
另外,如果您有任何在线资源可以阅读并探讨这个主题,我会非常高兴仔细研究它们。
谢谢!
2个回答

10

直接回答

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

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

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

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

仅将tools文件夹添加到程序包管理器控制台的PATH环境变量中(特别是不要将其添加到构建项目时为MSBuild设置的路径)。

2. 无论我向MyApp添加什么依赖项(例如CommandLineArgumentsParser),它们都会显示为相关项目的引用/依赖项。 我希望它们不会出现 - 是否可以防止这种情况发生?

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

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

<PackageReference Include="CommandLineArgumentsParser" Version="3.0.18" PriavateAssets="All">

如果不希望将所有依赖项都转换为包依赖项,请将此行添加到所有PackageReference节点的末尾:
<PackageReference Update="@(PackageReference)" PrivateAssets="All" />

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

NuGet不提供自动解决依赖项的能力,所以我们应该将我们的依赖项dll放入我们的tools文件夹中。如果您想知道如何添加依赖项,请阅读Nate McMaster的文章:MSBuild tasks with dependencies

4.如果我将包X指定为MyPkg的依赖项,那么包X将被安装到依赖于MyPkg的项目中。是否可以以某种方式引用X的DLL,以便我不必将它们与MyApp一起打包?

这个问题与第2个回答相同,请遵循第2个回答。

附加参考资料

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

这是临时的Google翻译版本,我会尽快将其翻译成英文并在此发布。

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


1
如果您想通过外部命令提示符访问命令行工具,请访问名为*.NET Core 2.1 Global Tools*的最后一个链接,但它仅适用于.NET Core 2.1。 - walterlv
1
非常有洞察力的回答。很想看看你博客文章的翻译。 - Daniel VH
很棒的答案。看起来现在使用dotnet全局工具是正确的选择。 - Pieterjan Spoelders

4

dotnet 工具

可能已经超越了 walterlv's answer 的方法是 .NET 工具

.NET 工具是一个特殊的 NuGet 包,其中包含一个控制台应用程序。您可以在本地或全局上安装工具。

创建过程在 Tutorial: Create a .NET tool 中完整描述,最少需要:

  1. 创建新的 .NET 控制台应用程序(.NET Core 3 或更新版本)
  2. <PackAsTool>true</PackAsTool> 添加到 csproj
  3. 使用 dotnet pack 进行构建

然后可以将 nupkg 发布到 NuGet 或通过将其目录添加为“源”来引用它。

全局安装

dotnet tool install -g Example.MyTool

你的团队其他成员需要运行相同的命令。

本地安装

# First time only, create dotnet-tools.json
dotnet new tool-manifest
dotnet tool install Example.MyTool

你的团队其他成员需要运行dotnet tool restore

运行工具

dotnet Example.MyTool

请参阅链接文档以获取更多详细信息和选项。

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