Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在NuGet中包含控制台应用程序的最佳实践_C#_Nuget_Console Application_.net Standard_Multi Targeting - Fatal编程技术网

C# 在NuGet中包含控制台应用程序的最佳实践

C# 在NuGet中包含控制台应用程序的最佳实践,c#,nuget,console-application,.net-standard,multi-targeting,C#,Nuget,Console Application,.net Standard,Multi Targeting,我正在开发一个开源库,它主要由一个面向.NET标准2.0的类库项目组成。除此之外,我还实现了一个控制台应用程序,它是这个库的CLI。控制台项目(出于历史原因)仅针对.NET Framework 4.6.2 现在我想知道,为了让这个控制台应用程序能够在社区中使用,最好的做法是什么。在最广泛的层面上,我看到两种可能性: 将console应用程序作为单独的NuGet发布 将console应用程序与类库放在同一个NuGet中,因为它只是一个次要的附加组件,不能证明自己的包是正确的 历史上,我一直在使用第

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

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

  • 将console应用程序作为单独的NuGet发布
  • 将console应用程序与类库放在同一个NuGet中,因为它只是一个次要的附加组件,不能证明自己的包是正确的
  • 历史上,我一直在使用第二种方法,但考虑到类库可以用于多目标场景,我不再确定。也许在一个单独的NuGet中分离控制台应用程序更干净,这样它对完整的.NET框架的依赖性就更清晰了

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

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

    我不一定想象有人从PackageManager控制台使用CLI。更确切地说,它将被用作独立的exe,在某个shell中。

    一般来说,(请注意“如果您的库…”这句话)

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

    还有包管理器针对其他平台:

  • (适用于Debian/Ubuntu/Mint)
  • (适用于MacOS)
  • (适用于软呢帽/红帽)
  • 注意:正如Martin Ullrich在评论中指出的那样,现在有了一个主要用于持续集成部署场景的

    一般来说,(注意“如果你的图书馆……”)

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

    还有包管理器针对其他平台:

  • (适用于Debian/Ubuntu/Mint)
  • (适用于MacOS)
  • (适用于软呢帽/红帽)
  • 注意:正如Martin Ullrich在评论中指出的那样,现在有了一个主要用于持续集成部署场景的


    有一个解决方案似乎适合你的需要。您可以为
    dotnet
    工具创建命令行扩展。与
    dotnet ef
    类似,您可以创建
    dotnet myAwesomeTool
    命令。您只需执行以下操作:

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

    <PackageId>Company.MyAwesomeTool</PackageId>
    <AssemblyName>dotnet-myAwesomeTool</AssemblyName>
    <PackageType>DotnetCliTool</PackageType>
    <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
    
    有关更多信息:
    有一种解决方案似乎适合您的需要。您可以为
    dotnet
    工具创建命令行扩展。与
    dotnet ef
    类似,您可以创建
    dotnet myAwesomeTool
    命令。您只需执行以下操作:

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

    <PackageId>Company.MyAwesomeTool</PackageId>
    <AssemblyName>dotnet-myAwesomeTool</AssemblyName>
    <PackageType>DotnetCliTool</PackageType>
    <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
    
    有关更多信息:

    很有趣。然而,访问这个页面,我读到的第一件事是:“巧克力-Windows软件包管理器”。我想这不包括Linux/Mac?这是我将.NET标准作为目标的首要原因。@Dejan您应该使用这些平台上存在的任何包管理器…apt get、brew、rpm或其他任何东西。NuGet应该只用于提供类库。@mason:这是一个有趣的评论:“NuGet应该只用于提供类库。”如果这是真的,那么这就回答了我的问题。你能支持一下这一说法,并将其作为一个答案发布吗?@Dejan我没有任何权威人士的明确声明。人们有不同的意见。例如,除了类库之外,任何东西都不喜欢使用NuGet包(.nupkg)。我不反对在巧克力或巧克力中使用.nupkg。我担心的是,不包含类库的包会污染NuGet存储库(NuGet.org)。存储库应该只有一个用途。如果它是一个真正的“工具”NuGet,则可以创建一个CLI工具包,该工具包可以在每个项目的基础上添加。即将发布的2.2.0版CLI还将通过
    dotnet安装工具
    提供“全局”工具。每个项目工具的文档:有趣。然而,访问这个页面,我读到的第一件事是:“巧克力-Windows软件包管理器”。我想这不包括Linux/Mac?这是我将.NET标准作为目标的首要原因。@Dejan您应该使用这些平台上存在的任何包管理器…apt get、brew、rpm或其他任何东西。NuGet应该只用于提供类库。@mason:这是一个有趣的评论:“NuGet应该只用于提供类库。”如果这是真的,那么这就回答了我的问题。你能支持一下这一说法,并将其作为一个答案发布吗?@Dejan我没有任何权威人士的明确声明。人们有不同的意见。例如,除了类库之外,任何东西都不喜欢使用NuGet包(.nupkg)。我不反对在巧克力或巧克力中使用.nupkg。我担心的是,不包含类库的包会污染NuGet存储库(NuGet.org)。存储库应该只有一个用途。如果它是一个真正的“工具”NuGet,则可以创建一个CLI工具包,该工具包可以在每个项目的基础上添加。即将发布的2.2.0版CLI还将通过
    dotnet安装工具
    提供“全局”工具。每个项目工具的文档:如果您构建的工具需要其他工具,那么这似乎会失败