尝鲜.net core2.1 ——编写一个global tool

本文内容参考微软工程师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生成项目如下

objProgram.csWebDownloader.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卸载即可。

原文地址:https://www.cnblogs.com/huanent/p/9119213.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321232.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

codeforces gym-101755 D-Transfer Window 二分图匹配、递归

题目 题目链接 题意 告诉了n名球员的交换关系&#xff0c;你现在拥有k名球员&#xff0c;你想要其他k名球员(有的在自己队里)。 输出一种交换方案。 题解 第一步、求闭包。 我们需要在原来的交换矩阵上跑可达闭包&#xff0c;即G[i][j]G[i][j]的含义是jj是否能通过i&quo…

【最短路】【Dijkstra】【图论】最小花费(jzoj 2125)

最小花费 题目大意&#xff1a; n个人&#xff0c;一些人之间可以相互转账&#xff0c;但又手续费x%,问A转给B100元至少要多少钱 样例输入 3 3 1 2 1 2 3 2 1 3 3 1 3 样例输出 103.07153164 数据范围限制 对于所有数据&#xff0c; 1 < n <2000。 解题思路…

jzoj1471-Y【bitset,dp,状压】

正题 题目大意 nnn个点mmm条边&#xff0c;边上是0/10/10/1&#xff0c;求有多少种不同的长度为ddd的路径序列 解题思路 我们将ddd分为两半&#xff0c;定义fi,j,sf_{i,j,s}fi,j,s​表示从iii出发到jjj&#xff0c;路径序列状态sss是否可行。 然后我们可以用bitsetbitsetbits…

Comet OJ-栈的数据结构题【线段树】

正题 题目链接:https://cometoj.com/contest/79/problem/E?problem_id4207 题目大意 nnn个栈&#xff0c;要求支持操作 l∼rl\sim rl∼r区间内的栈压入一个数l∼rl\sim rl∼r区间内的栈弹出一个数求第xxx个栈内第kkk个数 解题思路 对于每个询问我们其实就是要求在他之前的第…

codeforces gym-101755 I-Guess the Tree 交互题、分治、树的直径

题目 题目链接 题意 n2h−1&#xff0c;且1≤n≤1023n2h−1&#xff0c;且1≤n≤1023你可以最多询问2.5∗logn12∗n2.5∗log2n1∗n次&#xff0c;任意两点的距离&#xff0c;让你还原一颗完全二叉树。 题解 第一步、肯定要求整棵树的根节点。 由于这是一颗完全二叉树&…

【01背包】最大约数和(jzoj 2126)

最大约数和 题目大意&#xff1a; 选若干个正整数&#xff0c;和不小于S&#xff0c;使每个数的因数&#xff08;不包括本身&#xff09;之和最大 样例输入 11 样例输出 9 数据范围限制 对于30%的数据&#xff0c; S<10&#xff1b; 对于100%的数据&#xff0c; S …

微软75亿收购Github,微软以开发者为中心的初心不变

前天关于微软要收购 GitHub 的消息传出后&#xff0c;很多人都纷纷讨论&#xff0c;希望 GitHub 能够独立存在&#xff0c;不被任何大厂收购&#xff0c;可是 GitHub 也要生存啊。那又有人说&#xff1a;希望是 Google 来收购 GitHub &#xff0c;而不是微软&#xff0c;在大家…

nssl1476-联【线段树】

正题 题目大意 无限长的010101序列&#xff0c;每次进行一个操作 区间内赋值为000区间内赋值为111区间取反 求第一个000的位置 解题思路 离散化&#xff08;储存每个区间的左右端点和他们加一之后的值&#xff09;后可以用线段树储存第一个000和第一个111的位置。然后区间取…

洛谷-P3396 哈希冲突 分块

题目 题目链接 题意 给你个数列&#xff0c;编号为1…n1…n。 给出两种操作&#xff1a; 查询操作&#xff1a;查询所有编号模xx得y" role="presentation" style="position: relative;">yy的对应数字之和。修改操作&#xff1a;把编号为xx的数…

简明 ASP.NET Core 手册

编者&#xff1a;在4月份推送过这篇文章 简明 ASP.NET Core 手册 &#xff0c;今天再次推荐这篇文章&#xff0c;是因为原作者更新到了新版本1.1.0&#xff0c;改动很大&#xff0c;几乎所有章节都有很大程度的调整&#xff0c;这些调整都是根据读者的建议而做&#xff0c;而且…

【模拟】【递归】电子表格(jzoj 2127)

电子表格 题目大意&#xff1a; 有一个Excel文档&#xff0c;有4中操作&#xff1a;input输入一个格子的值&#xff0c;output输出一个格子的值&#xff0c;sum某个格子等于一块矩形中的总值&#xff08;矩形中的总值改变&#xff0c;这个格子也要改变&#xff09;&#xff0…

nssl1477-赛【对顶堆,贪心】

正题 题目大意 nnn个物品&#xff0c;有两个人&#xff0c;每个人有一些喜欢的物品。 选mmm个物品&#xff0c;至少选择kkk个第一个人喜欢的和kkk个第二个人喜欢的物品 解题思路 首先我们必定是选最小的 我们从小到大枚举选择多少两个人都喜欢的物品iii&#xff0c;然后每人选…

洛谷-P1903 数颜色 分块 bitset

题目 题目链接 题意 给你一个数列代表不同的颜色&#xff08;可以修改&#xff09;。 询问一段区间内有多少种颜色。 题解 很容易想到的就是线段树来维护bitset。 这里为了练习&#xff0c;使用分块维护bitset。 * 事实上线段树可以看成是无限分块。* 修改的时候直接暴…

《你必须掌握的Entity Framework 6.x与Core 2.0》正式出版感想

前言借书正式出版之际&#xff0c;完整回顾下从写博客到写书整个历程&#xff0c;也算是对自己近三年在技术上的一个总结&#xff0c;整个历程可通过三个万万没想到来概括&#xff0c;请耐心阅读。写博、写书完整历程回顾从2013年12月注册博客园账号&#xff0c;注册博客园账号…

2019.01.27【NOIP普及组】模拟赛C组总结

总结 这次比赛的得分是&#xff1a;1001001000300 这次比赛第一题推了一会&#xff0c;推出了公式&#xff0c;马上A掉了&#xff0c;第二题之前做过&#xff0c;当做复习&#xff0c;写了大概半小时&#xff0c;第三题打了一下表&#xff0c;又写了个01背包&#xff0c;A掉&a…

nssl1478-题【dp】

正题 题目大意 nnn个苹果&#xff0c;依次来mmm个人会在两个苹果(ui,vi)(u_i,v_i)(ui​,vi​)中选择一个吃&#xff08;如果都没了就不吃了&#xff09; 求有多少对苹果可以同时存活 解题思路 设gi,jg_{i,j}gi,j​表示iii不吃时jjj是否必吃&#xff0c;我们从后到前枚举边&…

Entity Framework Core 2.1带来更好的SQL语句生成方案

微软发布了Entity Framework Core2.1&#xff0c;为EF开发者带来了很多期待已久的特性。EF Core 2.1增加了对SQL GROUP BY的支持&#xff0c;支持延迟加载和数据种子等。EF Core 2.1的第一个重要新增特性是将GroupBy操作符翻译成包含GROUP BY子句的SQL。缺乏这种支持被认为是EF…

洛谷-P2801 教主的魔法 分块

题目 题目链接 题意 修改&#xff1a;将一个区间内所有的数C。查询&#xff1a;查询一个区间内>C的数字有多少个。 题解 很经典的分快算法题目。 将数列分块以后&#xff0c;对块内的元素进行排序。 当我们要做修改操作的时候&#xff1a;遇到要修改的完整的块的时候…

【枚举】数列(jzoj 1507)

数列 题目大意&#xff1a;给出一个等差数列的初始值和差值还有一个等比数列的处值和比值&#xff0c;问不大于n的数中&#xff0c;问这两个序列中&#xff0c;有多少个数小于n&#xff08;只要在一个序列中就行了&#xff0c;在两个序列中只记一次&#xff09; 样例输入 1 …

AT4352-[ARC101C] Ribbons on Tree【dp,容斥】

正题 题目链接: https://www.luogu.com.cn/problem/AT4352 https://atcoder.jp/contests/arc101/tasks/arc101_c 题目大意 nnn个点之间两两配对&#xff0c;要求配对点之间的路径覆盖整棵树&#xff0c;求方案数 解题思路 考虑容斥&#xff0c;我们钦定有lll条边没有路径覆盖…