如何创建一个基于命令行工具的跨平台的 NuGet 工具包

命令行可是跨进程通信的一种非常方便的手段呢,只需启动一个进程传入一些参数即可完成一些很复杂的任务。NuGet 为我们提供了一种自动导入 .props 和 .targets 的方法,同时还是一个 .NET 的包平台;我们可以利用 NuGet 发布我们的工具并自动启用这样的工具。

制作这样的一个跨平台 NuGet 工具,我们能够为安装此工具的项目提供自动的但定制化的编译细节——例如自动生成版本号,自动生成某些中间文件等。

本文更偏向于入门,只在帮助你一步一步地制作一个最简单的 NuGet 工具包,以体验和学习这个过程。然后我会在另一篇博客中完善其功能,做一个完整可用的 NuGet 工具。


关于创建跨平台 NuGet 工具包的博客,我写了两篇。一篇介绍写基于 MSBuild Task 的 dll,一篇介绍写任意的命令行工具,可以是用于 .NET Framework 的 exe,也可以是基于 .NET Core 的 dll,甚至可以是使用本机工具链编译的平台相关的各种格式的命令行工具。内容是相似的但关键的坑不同。我分为两篇可以减少完成单个任务的理解难度:

第零步:前置条件

第一步:创建一个项目,用来写工具的核心逻辑

为了方便制作跨平台的 NuGet 工具,新建项目时我们优先选用 .NET Core 控制台项目。

新建一个项目

紧接着,我们需要打开编辑此项目的 .csproj 文件,填写必要的信息(尤其是 <GeneratePackageOnBuild>,确保编译时会生成 NuGet 包)。

<!-- Walterlv.NuGetTool.csproj -->
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <!-- 输出为 exe(其实对于 .NET Core 依然是 dll,除非进行发布)。 -->
    <OutputType>Exe</OutputType>
    <!-- 给一个初始的版本号。 -->
    <Version>1.0.0-alpha</Version>
    <!-- 由于 .NET Core 本身即具备跨平台的特性,所以我们直接基于 .NET Core 开发 -->
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <!-- 这个就是创建项目时使用的名称。 -->
    <AssemblyName>Walterlv.NuGetTool</AssemblyName>
    <!-- 此值设为 true,才会在编译之后生成 NuGet 包。 -->
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <!-- 作者的 Id,如果要发布到 nuget.org,那么这里就是 NuGet 用户 Id。 -->
    <Authors>walterlv</Authors>
  </PropertyGroup>
</Project>

接下来随便在 Program.cs 里写什么代码,这取决于你希望这个 NuGet 工具做什么。

using System;

namespace Walterlv.NuGetTool
{
   
    class Program
    {
   
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

这时进行编译,我们的 NuGet 包就会出现在项目的输出目录 bin\Debug 下了。

输出目录下的 NuGet 包

第二步:组织 NuGet 目录

刚刚生成的 NuGet 包还不能真正拿来用。事实上你也可以拿去安装,不过最终的效果只是加了一个毫无作用的引用程序集而已(事实上就是把你写的程序作为普通 dll 引用了)。

所以,我们需要进行“一番配置”,使得这个项目编译成一个NuGet 工具,而不是一个依赖包

现在,介绍一下 NuGet 预设的目录(如果你想看,可以去解压 .nupkg 文件):

// 根目录,用来放 readme.txt 的(已经有人提 issue 要求加入 markdown 支持了)
+ /
// 用来放引用程序集 .dll,文档注释 .xml 和符号文件 .pdb 的
+ lib/
// 用来放那些与平台相关的 .dll/.pdb/.pri 的
+ runtimes/
// 任意种类的文件,在这个文件夹中的文件会在编译时拷贝到输出目录(保持文件夹结构)
+ content/
// 这里放 .props.targets 文件,会自动被 NuGet 导入,成为项目的一部分(要求文件名与包名相同)
+ build/
// 这里也是放 .props.targets 文件,会自动被 NuGet 导入,成为项目的一部分(要求文件名与包名相同)
+ buildMultiTargeting/
// PowerShell 脚本或者程序,在这里的工具可以在“包管理控制台”(Package Manager Console) 中使用
+ tools/

▲ 以上结构可以去官网翻阅原文 How to create a NuGet package - Microsoft Docs,不过我这里额外写了一个预设目录 buildMultiTargeting,官方文档却没有说。

注意到我们的 csproj 文件中的 <TargetFrameworks> 节点吗?如果指定为单个框架,则自动导入的是 build 目录下的;如果指定为多个框架,则自动导入的是 buildMultiTargeting 目录下的。

我们的初衷是做一个 NuGet 工具,所以我们需要选择合适的目录来存放我们的输出文件。

我们要放一个 Walterlv.NuGetTool.targets 文件到 buildbuildMultiTargeting 文件夹中,以便能够让我们定制编译流程。我们要让我们写的 .NET Core 工具程序能够工作,所以我们将生成的输出程序放到 tools 目录下。

于是我们自己的目录结构为:

+ build/
    - Walterlv.NuGetTool.targets
+ buildMultiTargeting/
    - Walterlv.NuGetTool.targets
+ tools
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值