【问题标题】:How to pack command line tools with NuGet?如何使用 NuGet 打包命令行工具?
【发布时间】:2018-06-18 19:55:57
【问题描述】:

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

目标:

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

我使用 C# 定位 net461netcore2

问题:

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

  1. 您能否确认约定是 MyApp 二进制文件应放入 NuGet 包中的 tools 文件夹?
  2. 无论我添加到 MyApp 的任何依赖项(例如 CommandLineArgumentsParser),它们都会在依赖项目中显示为引用/依赖项。我希望他们没有 - 可以预防吗?
  3. MyApp 二进制文件旁边的 bin 文件夹中还有其他依赖项 dlls。它们是来自其他软件包的 dll。将这些也包含在我的包中是否是一种好习惯?
  4. 如果我将包 X 指定为 MyPkg 的依赖项,则会根据 MyPkg 为项目安装包 X。能否以某种方式引用 X 的 DLL,这样我就不必用 MyApp 打包它们?

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

另外,如果您有任何我可以阅读的涉及该主题的在线资源,我会非常乐意仔细阅读它们。

谢谢!

【问题讨论】:

    标签: c# nuget package tooling


    【解决方案1】:

    直接回答

    1.您能否确认约定是 MyApp 二进制文件应放入 NuGet 包中的工具文件夹?

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

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

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

    工具文件夹仅添加到包管理器控制台的 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 打包它们?

    这道题和第2题一样,按照第2题回答即可。

    其他参考资料

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

    这是临时的谷歌翻译版本,我会尽快翻译成英文并在这里发布。

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

    【讨论】:

    • 如果您想通过外部命令提示符访问命令行工具,请访问名为 .NET Core 2.1 Global Tools 的最后一个链接,但它适用于 .NET Core 2.1仅限。
    • 非常有见地的回应。热衷于阅读您博客文章的翻译。
    • 很好的答案。看来 dotnet 全球工具是现在要走的路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多