在 NuGet 中包含控制台应用程序的最佳实践
Best practice to include console app in NuGet
我正在开发一个开源库,主要由一个 class-library 项目组成,目标是 .NET Standard 2.0。最重要的是,我还实现了一个控制台应用程序,它是该库的 CLI。控制台项目(由于历史原因)仅针对 .NET Framework 4.6.2。
现在我想知道要让社区可以使用此控制台应用程序的最佳做法是什么。在最广泛的层面上,我看到两种可能性:
- 将控制台应用作为单独的 NuGet 发布。
- 在与 class 库相同的 NuGet 中发布控制台应用程序,因为它只是一个次要的附加组件,并不能证明自己的包是合理的。
过去,我一直使用第二种方法,但考虑到 class 库可用于多目标场景,我不再确定了。也许将控制台应用程序分离到它自己的 NuGet 中会更清晰,这样它对完整 .NET 框架的依赖性就很清楚了。
无论哪种方式,我都想知道控制台 exe 属于 NuGet 文件结构中的哪个位置。从历史上看,我一直把它放在 tools\net462
下,但是 this page 上关于 tools
文件夹的评论让我感到不安:
Powershell scripts and programs accessible from the Package Manager Console
我不一定想象有人使用 Package Manager Console 中的 CLI。相反,它会在某个地方用作独立的 exe shell.
一般来说,NuGet is meant only for delivering class libraries(注意措辞"if your library...")。
改为使用 Chocolatey 将命令行和 GUI 应用程序部署到 Windows。它有一个 CLI,可用于轻松安装和更新应用程序。它不是NuGet
,而是使用类似的方法来打包和部署应用程序。
还有针对其他平台的包管理器:
NOTE: As Martin Ullrich pointed out in the comments, there is now a way to deploy build tool CLIs with NuGet, which is primarily meant for continuous integration deployment scenarios.
似乎有一个解决方案符合您的需要。您可以为 dotnet
工具创建命令行扩展。像 dotnet ef
你可以创建一个 dotnet myAwesomeTool
命令。您唯一需要做的就是以下内容:
创建控制台应用程序并将以下代码添加到您的 .csproj
<PackageId>Company.MyAwesomeTool</PackageId>
<AssemblyName>dotnet-myAwesomeTool</AssemblyName>
<PackageType>DotnetCliTool</PackageType>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
构建解决方案,您将在 bin 文件夹中找到一个 nuget 包。这个 nuget 包可以分发,当你安装它时,你可以 运行 dotnet myAwesomeTool
在安装了 nuget 的项目中。对我来说就像一个魅力 =)
要在其他项目上安装它,请将其添加到 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
随着时间的流逝,其他解决方案可用...
https://docs.microsoft.com/nl-nl/dotnet/core/tools/global-tools-how-to-create
<PackAsTool>true</PackAsTool>
<ToolCommandName>botsay</ToolCommandName>
<PackageOutputPath>./nupkg</PackageOutputPath>
我正在开发一个开源库,主要由一个 class-library 项目组成,目标是 .NET Standard 2.0。最重要的是,我还实现了一个控制台应用程序,它是该库的 CLI。控制台项目(由于历史原因)仅针对 .NET Framework 4.6.2。
现在我想知道要让社区可以使用此控制台应用程序的最佳做法是什么。在最广泛的层面上,我看到两种可能性:
- 将控制台应用作为单独的 NuGet 发布。
- 在与 class 库相同的 NuGet 中发布控制台应用程序,因为它只是一个次要的附加组件,并不能证明自己的包是合理的。
过去,我一直使用第二种方法,但考虑到 class 库可用于多目标场景,我不再确定了。也许将控制台应用程序分离到它自己的 NuGet 中会更清晰,这样它对完整 .NET 框架的依赖性就很清楚了。
无论哪种方式,我都想知道控制台 exe 属于 NuGet 文件结构中的哪个位置。从历史上看,我一直把它放在 tools\net462
下,但是 this page 上关于 tools
文件夹的评论让我感到不安:
Powershell scripts and programs accessible from the Package Manager Console
我不一定想象有人使用 Package Manager Console 中的 CLI。相反,它会在某个地方用作独立的 exe shell.
一般来说,NuGet is meant only for delivering class libraries(注意措辞"if your library...")。
改为使用 Chocolatey 将命令行和 GUI 应用程序部署到 Windows。它有一个 CLI,可用于轻松安装和更新应用程序。它不是NuGet
,而是使用类似的方法来打包和部署应用程序。
还有针对其他平台的包管理器:
NOTE: As Martin Ullrich pointed out in the comments, there is now a way to deploy build tool CLIs with NuGet, which is primarily meant for continuous integration deployment scenarios.
似乎有一个解决方案符合您的需要。您可以为 dotnet
工具创建命令行扩展。像 dotnet ef
你可以创建一个 dotnet myAwesomeTool
命令。您唯一需要做的就是以下内容:
创建控制台应用程序并将以下代码添加到您的 .csproj
<PackageId>Company.MyAwesomeTool</PackageId>
<AssemblyName>dotnet-myAwesomeTool</AssemblyName>
<PackageType>DotnetCliTool</PackageType>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
构建解决方案,您将在 bin 文件夹中找到一个 nuget 包。这个 nuget 包可以分发,当你安装它时,你可以 运行 dotnet myAwesomeTool
在安装了 nuget 的项目中。对我来说就像一个魅力 =)
要在其他项目上安装它,请将其添加到 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
随着时间的流逝,其他解决方案可用...
https://docs.microsoft.com/nl-nl/dotnet/core/tools/global-tools-how-to-create
<PackAsTool>true</PackAsTool>
<ToolCommandName>botsay</ToolCommandName>
<PackageOutputPath>./nupkg</PackageOutputPath>