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

时间:2018-06-18 11:06:14

标签: c# nuget package tooling

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

目标:

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

我使用 C#定位 net461 netcore2

问题:

我将引用我的工具应用及其包MyAppMyPkg

  1. 您能否确认惯例是MyApp二进制文件应该进入NuGet包中的tools文件夹?
  2. 无论我添加到 MyApp 的依赖项(例如CommandLineArgumentsParser),它们都会在依赖项目中显示为引用/依赖项。我希望他们没有 - 可以预防吗?
  3. MyApp 二进制文件旁边的bin文件夹中还有其他依赖项dll。它们是来自其他包装的dll。将这些包含在我的包装中也是一个好习惯吗?
  4. 如果我将包X指定为 MyPkg 的依赖关系,则将根据 MyPkg 为项目安装包X.是否可以以某种方式引用X的DLL,以便我不必使用 MyApp 打包它们?
  5. 我希望我的问题很明确。如果我写的内容对你没有意义,请求澄清 - 不能指望你是一个思想领袖:)

    另外,如果你有任何我可以阅读的在线资源来解决这个问题,我会非常乐意通过它们来咀嚼。

    谢谢!

1 个答案:

答案 0 :(得分:3)

直接回答

1.您是否可以确认惯例是MyApp二进制文件应该进入NuGet包中的tools文件夹?

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

请参阅NuGet官方文档:How to create a NuGet package - Microsoft Docs。对于tools文件夹,它说:

  

可从Package Manager控制台访问的Powershell脚本和程序。

     

tools文件夹仅添加到Package Manager控制台的PATH环境变量中(具体而言,不是在构建项目时为MSBuild设置的PATH)。

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

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

请参阅NuGet官方文档:NuGet PackageReference format (package references in project files) | Microsoft Docs。只需将此代码添加到您不希望被目标项目引用的任何依赖项中。

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

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

<PackageReference Update="@(PackageReference)" PrivateAssets="All" />

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

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

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

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

其他参考资料

我已写过这样的帖子来帮助我们用NuGet打包命令行工具,但它不是英文版。我今天很高兴将它翻译成英文,以便你可以阅读学习。

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

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

相关问题