【问题标题】:Best practice to include console app in NuGet在 NuGet 中包含控制台应用程序的最佳实践
【发布时间】:2018-06-14 11:57:48
【问题描述】:

我正在开发一个开源库,它主要由一个面向 .NET Standard 2.0 的类库项目组成。最重要的是,我还实现了一个控制台应用程序,它是这个库的 CLI。控制台项目(出于历史原因)仅针对 .NET Framework 4.6.2。

现在我想知道为了让社区可以使用这个控制台应用程序,最佳做法是什么。在最广泛的层面上,我看到了两种可能性:

  1. 将控制台应用程序作为单独的 NuGet 提供。
  2. 在与类库相同的 NuGet 中提供控制台应用程序,因为它只是一个次要的附加组件,并不能证明自己的包是合理的。

从历史上看,我一直在使用第二种方法,但考虑到类库可以用于多目标场景,我不确定了。也许在自己的 NuGet 中分离控制台应用程序会更干净,这样它对完整 .NET 框架的依赖就很清楚了。

无论哪种方式,我都想知道控制台 exe 在 NuGet 的文件结构中属于哪个位置。从历史上看,我一直把它放在tools\net462 下,但是this page 上关于tools 文件夹的评论让我不安全:

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

我不一定想象有人使用包管理器控制台中的 CLI。相反,它会在某个 shell 中用作独立的 exe。

【问题讨论】:

    标签: c# nuget console-application .net-standard multi-targeting


    【解决方案1】:

    随着时间的推移,其他解决方案会出现......

    https://docs.microsoft.com/nl-nl/dotnet/core/tools/global-tools-how-to-create

    <PackAsTool>true</PackAsTool>
    <ToolCommandName>botsay</ToolCommandName>
    <PackageOutputPath>./nupkg</PackageOutputPath>
    

    【讨论】:

      【解决方案2】:

      似乎有一种解决方案可以满足您的需求。您可以为dotnet 工具创建命令行扩展。像dotnet ef 一样,您可以创建dotnet myAwesomeTool 命令。您唯一需要做的就是以下几点:

      创建一个控制台应用程序并将以下代码添加到您的 .csproj

      <PackageId>Company.MyAwesomeTool</PackageId>
      <AssemblyName>dotnet-myAwesomeTool</AssemblyName>
      <PackageType>DotnetCliTool</PackageType>
      <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
      

      构建解决方案,您将在 bin 文件夹中找到一个 nuget 包。这个 nuget 包可以分发,安装后可以在安装了 nuget 的项目中运行dotnet myAwesomeTool。对我来说就像一个魅力 =)

      要将其安装在其他项目上,请将其添加到 csproj:

      <ItemGroup>
        <PackageReference Include="company.MyAwesomeTool" Version="1.0.0" />
      </ItemGroup>
      <ItemGroup>
        <DotNetCliToolReference Include="company.MyAwesomeTool" Version="1.0.0" />
      </ItemGroup>
      

      更多信息: https://blog.maartenballiauw.be/post/2017/04/10/extending-dotnet-cli-with-custom-tools.html

      【讨论】:

      • 如果您构建的工具需要其他(非工具)nuget 包,这似乎会失败。 (安装时出现错误 NU1212)
      • 我引用了很多“非工具”的 nuget 包来构建 nuget 工具,但我没有收到这样的错误。这是一年多以前的事了,但我很有信心它直到今天才改变。如果没有任何其他 nuget 包,你将如何构建一个 nuget 包,比如说 newtonsoft-json。我认为这不是问题。
      【解决方案3】:

      一般,NuGet is meant only for delivering class libraries(注意措辞“如果您的库......”)。

      使用Chocolatey,而是将命令行和GUI应用程序部署到Windows。它具有可用于轻松安装和更新应用程序的CLI。它是 not NuGet,但使用类似的方法来打包和部署应用程序。

      还有一个包管理器来定位其他平台:

      1. apt-get(对于debian / ubuntu / mint)
      2. Brew(对于麦斯科斯)
      3. RPM(对于fedora /红色帽子)

      注意:作为Martin Ullrich指出在CMET中,现在有一个way to deploy build tool CLIs with NuGet,主要用于连续集成部署方案。

      【讨论】:

      • 有趣。但是,访问此页面,我读到的第一件事是:“巧克力 - Windows的包管理器”。我猜,排除了Linux / Mac?这是我有针对性的.NET标准的最重要原因。 span>
      • @ dejan,您应该使用这些平台的任何包管理器.... APT-GET,BREW,RPM或其他什么。 Nuget只应该用于服务类图书馆。 span>
      • @ mason:这是一个有趣的评论:“Nuget应该只用于提供类库。”如果这是真的,那么那就是我的问题。你可以备份这个索赔一点点并将其发布为答案吗? span>
      • @ dejan我没有备受尊重的权威的任何公司陈述。人们有不同的意见。例如,this Microsoft employee不喜欢使用除类库之外的任何内容的nuget包(.nupkg)。我没有反对使用.nupkg巧克力或OctopusPowerShellGet。我的关注是与污染Nuget Repository(Nuget.org)与不包含类库的软件包。存储库应该有一个目的。 span>
      • 如果它是一个真正的“工具”nuget,您可以创建可以按项目添加的CLI工具包。即将到来的2.2.0版本的CLI也将通过dotnet install tool。每个项目工具的文档:docs.microsoft.com/en-us/dotnet/core/tools/… span>
      猜你喜欢
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多