1. 程式人生 > >嘗鮮.net core2.1 ——編寫一個global tool

嘗鮮.net core2.1 ——編寫一個global tool

tput for angular gas mage target 微軟官方 tco 正式

本文內容參考微軟工程師Nate McMaster的博文.NET Core 2.1 Global Tools

用過npm開發都知道,npm包都可以以全局的方式安裝,例如安裝一個http-server服務,可以使用npm i http-server -g來將http-server包安裝到全局環境。安裝完之後,就可以通過cmd或者powershell運行全局工具http-server命令,來使用靜態托管服務。dotnet tool 就是一個類似npm全局工具的新特性,在.net core2.1正式加入。它的詳細使用方法可在微軟官方文檔查看,本文主要介紹如何編寫一個global tool並發布至nuget。

安裝.net core 2.1

安裝最新版.net core SDK 可前往DotNet官方站點的下載頁面,下載完成後雙擊安裝即可。安裝完成後打開cmd運行dotnet --version 返回版本大於或等於2.1.300表示安裝成功。

安裝global tool 項目模板

打開cmd 鍵入dotnet new --install McMaster.DotNet.GlobalTool.Templates安裝完成後運行dotnet new

模板                                                短名稱                語言                標記
----------------------------------------------------------------------------------------------------------------------------
Console Application                               console            [C#], F#, VB      Common/Console
Class library                                     classlib           [C#], F#, VB      Common/Library
.NET Core Global Console Tool                     global-tool        [C#]              Console/Empty
Unit Test Project                                 mstest             [C#], F#, VB      Test/MSTest
xUnit Test Project                                xunit              [C#], F#, VB      Test/xUnit
Razor Page                                        page               [C#]              Web/ASP.NET
MVC ViewImports                                   viewimports        [C#]              Web/ASP.NET
MVC ViewStart                                     viewstart          [C#]              Web/ASP.NET
ASP.NET Core Empty                                web                [C#], F#          Web/Empty
ASP.NET Core Web App (Model-View-Controller)      mvc                [C#], F#          Web/MVC
ASP.NET Core Web App                              razor              [C#]              Web/MVC/Razor Pages
ASP.NET Core with Angular                         angular            [C#]              Web/MVC/SPA
ASP.NET Core with React.js                        react              [C#]              Web/MVC/SPA
ASP.NET Core with React.js and Redux              reactredux         [C#]              Web/MVC/SPA
Razor Class Library                               razorclasslib      [C#]              Web/Razor/Library/Razor Class Library
ASP.NET Core Web API                              webapi             [C#], F#          Web/WebAPI
global.json file                                  globaljson                           Config
NuGet Config                                      nugetconfig                          Config
Web Config                                        webconfig                            Config
Solution File                                     sln                                  Solution

多出一個global-tool模板

.NET Core Global Console Tool                     global-tool        [C#]              Console/Empty

編寫一個網頁下載工具

接下來通過編寫一個網頁下載的小工具來演示global tool的創建過程,此小工具的功能是根據網址,下載相應的頁面html並保存為文件。

首先新建一個WebDownloader文件夾。在文件夾中運行dotnet new global-tool生成項目如下

obj
Program.cs
WebDownloader.csproj

打開WebDownloader.csproj修改為

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <ToolCommandName>web-downloader</ToolCommandName>
    <PackAsTool>True</PackAsTool>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="McMaster.Extensions.CommandLineUtils" Version="2.2.3" />
  </ItemGroup>

</Project>

打開Program.cs修改為

using System;
using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Net.Http;
using McMaster.Extensions.CommandLineUtils;

namespace WebDownloader
{
    [Command(Description = "網頁下載小工具")]
    class Program
    {
        public static int Main(string[] args) => CommandLineApplication.Execute<Program>(args);

        [Argument(0, Description = "網址")]
        [Required]
        public string Url { get; }

        [Option(Description = "保存路徑")]
        public string Path { get; } = "./";

        [Option(Description = "文件名")]
        public string Name { get; } = "content.txt";

        private int OnExecute()
        {
            var client = new HttpClient();
            var content = client.GetStringAsync(Url).Result;
            var path = System.IO.Path.Combine(Path, Name);
            File.WriteAllText(path, content);
            return 0;
        }
    }
}

修改完成後全部保存文件,運行dotnet pack -o ./會在項目根目錄生成一個WebDownloader.1.0.0.nupkg包。此包就是最終的nuget包,可上傳至nuget.org共享。

為了測試,我們直接將此包安裝至本地計算機。運行dotnet tool install WebDownloader -g --add-source ./完成安裝。運行web-downloader -h可以看到項目幫助文檔

網頁下載小工具

Usage: WebDownloader [arguments] [options]

Arguments:
  Url               網址

Options:
  -p|--path <PATH>  保存路徑
  -n|--name <NAME>  文件名
  -?|-h|--help      Show help information

運行web-downloader http://www.sina.com後我們發現項目根目錄生成了一個content.txt文件內容為新浪的首頁html

<!DOCTYPE html>
<!-- [ published at 2018-05-31 23:35:00 ] -->
<html>
<head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <title>新浪首頁</title>
    <meta name="keywords" content="新浪,新浪網,SINA,sina,sina.com.cn,新浪首頁,門戶,資訊" />
    <meta name="description" content="新浪網為全球用戶24小時提供全面及時的中文資訊,內容覆蓋國內外突發新聞事件、體壇賽事、娛樂時尚、產業資訊、實用信息等,設有新聞、體育、娛樂、財經、科技、房產、汽車等30多個內容頻道,同時開設博客、視頻、論壇等自由互動交流空間。" />
    <link rel="mask-icon" sizes="any" href="//www.sina.com.cn/favicon.svg" color="red">
    <meta name="stencil" content="PGLS000022" />
    <meta name="publishid" content="30,131,1" />
    <meta name="verify-v1" content="6HtwmypggdgP1NLw7NOuQBI2TW8+CfkYCoyeB8IDbn8=" />
    <meta name="360-site-verification" content="63349a2167ca11f4b9bd9a8d48354541" />
    <meta name="application-name" content="新浪首頁"/>
    <meta name ="msapplication-TileImage" content="//i1.sinaimg.cn/dy/deco/2013/0312/logo.png"/>
    <meta name="msapplication-TileColor" content="#ffbf27"/>
    <meta name="sogou_site_verification" content="Otg5irx9wL"/>
<link rel="apple-touch-icon" href="//i3.sinaimg.cn/home/2013/0331/U586P30DT20130331093840.png" />
...
...

如果不再使用此工具通過dotnet tool uninstall WebDownloader -g卸載即可。

嘗鮮.net core2.1 ——編寫一個global tool