實現一個更新所有 dotnet tool 的 dotnet tool

實現一個更新所有 dotnet tool 的 dotnet tool

Intro

dotnet tool 是從 .NET Core 2.1 開始支持的命令行工具,在使用 dotnet tool 比較多了的時候,想要更新所有的 dotnet tool 就比較麻煩,而目前 .NET SDK 還不支持,也有一些人希望能夠支持一次更新所有的 dotnet tool 這樣我們就不需要一個一個地去更新了

Implement

實現思路比較簡單,獲取所有的 dotnet tool 并逐個進行更新

我們可以通過 dotnet tool list -g command 來獲取我們安裝的所有的 dotnet global tool,輸出結果如下:

1a659e702097011d7d1cb194ab7165e2.png

dotnet tool list sample

第一行是一個標題,第二行是分隔線,從第三行開始是 dotnet tool 數據

第一列是 NuGet package id, 第二列是 package version, 第三列是 dotnet tool 對應的命令,我們可以獲取 dotnet tool list -g ?輸出并從第三行開始讀取數據,只需要讀取第一列數據的 package id 即可

獲取所有 dotnet tool list 的代碼如下:

//?get?dotnet?path
var?dotnetPath?=?ApplicationHelper.GetDotnetPath();
//?execute?`dotnet?tool?list?-g`?to?get?all?dotnet?tool
var?dotnetToolListOutput?=?await?CommandExecutor.ExecuteAndCaptureAsync(dotnetPath,?"tool?list?-g");
//?output
Console.WriteLine("`dotnet?tool?list?-g`?output:");
Console.WriteLine(dotnetToolListOutput.StandardOut);

拿到輸出結果之后,我們就可以得到 dotnet tool list 并開始逐個更新了,實現如下:

var?dotnetToolList?=?dotnetToolListOutput.StandardOut.Split(Environment.NewLine,?StringSplitOptions.RemoveEmptyEntries);
if?(dotnetToolList.Length?>?2)
{foreach?(var?tool?in?dotnetToolList[2..]){var?toolId?=?tool.Split('?',?StringSplitOptions.RemoveEmptyEntries)[0].Trim();if?(fullToolName.Equals(toolId)){continue;}Console.WriteLine($"update?tool?{toolId}...");try{await?CommandExecutor.ExecuteAsync(dotnetPath,?$"tool?update?-g?{toolId}");Console.WriteLine($"update?tool?{toolId}?completed");}catch?(Exception?ex){Console.WriteLine($"update?tool?{toolId}?failed:?{ex}");}}
}

至此我們的核心邏輯就基本完成了,實現效果如下:

6685c78ce7fd0784fb1827174e6db439.png

dotnet-update-all-tools

如果要發布還要準備一下 nuget package 的一些信息

<PropertyGroup><IsPackable>true</IsPackable><PackAsTool>true</PackAsTool><ToolCommandName>dotnet-update-all-tools</ToolCommandName><PackageId>dotnet-update-all-tools</PackageId><Version>1.0.0</Version>
</PropertyGroup>

PackAsTool 意味著我們要打包一個 dotnet tool

ToolCommandName是我們 tool 安裝后對應的執行命令

More

上面的 ApplicationHelper.GetDotnetPath() 實現是通過掃描 PATH 找到可執行的dotne path,有些 platform 上需要 full path 才能工作,實現可以參考:https://github.com/WeihanLi/WeihanLi.Common/blob/86b6acc10f50df5867c590ca10039c1e7a8bb740/src/WeihanLi.Common/Helpers/ApplicationHelper.cs#L61

CommandExecutor 實現是起了一個進程并捕獲進程輸出,可以參考:https://github.com/WeihanLi/WeihanLi.Common/blob/86b6acc10f50df5867c590ca10039c1e7a8bb740/src/WeihanLi.Common/Helpers/CommandExecutor.cs#L45

最終的 dotnet tool ?在 System.CommandLine的基礎上包裝了一下,以為了更好的體驗和擴展的方便

var?command?=?new?Command(toolName);
command.SetHandler(async?()?=>
{//?前面的邏輯在這里
});
await?command.InvokeAsync(args);

自此我們的 dotnet tool 就完成了

可以通過下面的命令來進行安裝

dotnet?tool?install?--global?dotnet-update-all-tools

安裝好之后執行 dotnet-update-all-tools 即可更新所有的 dotnet tool 了

References

  • https://www.nuget.org/packages/dotnet-update-all-tools

  • https://github.com/WeihanLi/SamplesInPractice/tree/master/CommandLineAppSamples/UpgradeAllTools

  • https://github.com/WeihanLi/WeihanLi.Common/blob/86b6acc10f50df5867c590ca10039c1e7a8bb740/src/WeihanLi.Common/Helpers/ApplicationHelper.cs#L61

  • https://github.com/WeihanLi/WeihanLi.Common/blob/86b6acc10f50df5867c590ca10039c1e7a8bb740/src/WeihanLi.Common/Helpers/CommandExecutor.cs#L45

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280666.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280666.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280666.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C# 普通權限運行程序\非管理員運行\降低權限運行

一、目的與實際 1.VS設置管理員權限運行程序后&#xff0c;發現調用powershell命令或程序需要普通權限即可&#xff0c;Administrator權限反而錯。 2.網上搜索關鍵字&#xff0c;大部分都是怎么使用管理員權限運行。 3.bing搜索意外發現有相關資料&#xff0c;記錄分享。 二…

am335x PDK3.0 設置為單網口配置記錄

原來的配置是雙網口的&#xff0c;現在要配置為單網口。一直以為這個配置是在 make menuconfig 里面&#xff0c; 沒想到是在設備樹里面。修改設備樹// vim arch/arm/boot/dts/am335x-sbc7109.dts722 &mac {723 pinctrl-names "default", "sleep"…

[AHOI2009]飛行棋 BZOJ1800

題目描述 給出圓周上的若干個點&#xff0c;已知點與點之間的弧長&#xff0c;其值均為正整數&#xff0c;并依圓周順序排列。 請找出這些點中有沒有可以圍成矩形的&#xff0c;并希望在最短時間內找出所有不重復矩形。 輸入輸出格式 輸入格式&#xff1a;第一行為正整數N&…

webapi+Quartz.NET解決若干定時程序同時運行的問題

項目現狀&#xff1a; 有若干定時程序需要自啟動運行&#xff0c;為了簡便程序部署等問題&#xff0c;采取這種辦法把定時程序集中管理到webapi中跟隨api發布 代碼架構介紹&#xff1a; 新建一個類庫&#xff0c;類庫引用Quartz&#xff08;Quartz.2.3.2&#xff09;&#xff0…

mac恢復iphone_免費下載:舊Mac和iPhone壁紙的令人震驚的完整檔案

mac恢復iphoneLove or hate Apple, you’ve got to admit: their background images are consistently stunning. Now you can download all of them. 愛或恨蘋果&#xff0c;您必須承認&#xff1a;它們的背景圖像始終令人贊嘆。 現在&#xff0c;您可以下載所有這些文件。 A …

Django01-1: request 方法

#POST request.method #返回全大寫字符穿&#xff0c;<class str> POST/GETrequest.POST #用戶提交數據&#xff0c;不包含文件 #<QueryDict>request.POST.get(hobby) #拿列表最后一個 request.POST.getList(hobby) #拿多個&#xff0c;列表全部#GET 獲取url &a…

Magicodes.IE 2.7.1發布

2.7.12022.12.01Magicodes.IE.EPPlus默認添加SkiaSharp.NativeAssets.Linux.NoDependencies包&#xff0c;以便于在Linux環境下使用導入驗證支持將錯誤數據通過Stream的方式返回&#xff0c;感謝sampsonye &#xff08;見pr#466&#xff09;2.7.02022.11.07添加SkiaSharp移除Si…

Oracle監聽的靜態注冊和動態注冊

靜態注冊&#xff1a;通過解析listene.ora文件 動態注冊&#xff1a;由PMON進程動態注冊至監聽中 在沒有listener.ora配置文件的情況下&#xff0c;如果啟動監聽&#xff0c;則監聽為動態注冊。用圖形化netca創建的監聽&#xff0c;默認也為動態注冊 1.靜態注冊 listener.ora文…

AKOJ-1695-找素數

題意&#xff1a; 給定區間L&#xff0c;R。 計算區間中素數個數。 2 < L,R < 2147483647, R-L < 1000000。 思路&#xff1a; 素數區間篩 先篩(2-sqrt(r))。 再用(2-sqrt(r))中的素數篩(l-r)。 代碼: 1.自己寫的區間篩&#xff0c;將篩2-sqrt&#xff08;r) 分開了。…

Spring 環境與profile(一)——超簡用例

什么是profile,為什么需要profile? 在開發時&#xff0c;不同環境&#xff08;開發、聯調、預發、正式等&#xff09;所需的配置不同導致&#xff0c;如果每改變一個環境就更改配置不但麻煩&#xff08;修改代碼、重新構建&#xff09;而且容易出錯。Spring提供了解決方案。 方…

Django04-1: ORM增刪改查

ORM 增刪改查 一、字段增加 #終端輸入 1.model里添加字段&#xff0c; 2.執行遷移命令。 3.終端里輸入默認值&#xff0c;繼續執行遷移命令。 #允許為空 再nulltrue&#xff0c;終端不需要輸入默認值 #設置默認值 defalult‘xxxx‘ 二、字段修改 1.直接修改代碼&…

Comcast以純文本泄露客戶Wi-Fi登錄信息,立即更改密碼

A Comcast Xfinity website was leaking Wi-Fi names and passwords, meaning now is a good time to change your Wi-Fi passcode. Comcast Xfinity網站泄漏了Wi-Fi名稱和密碼&#xff0c;這意味著現在是更改Wi-Fi密碼的好時機。 The site, intended to help new customers se…

SpringBoot詳解(一)-快速入門

SpringBoot詳解系列文章&#xff1a;SpringBoot詳解&#xff08;一&#xff09;-快速入門SpringBoot詳解&#xff08;二&#xff09;-Spring Boot的核心SpringBoot詳解&#xff08;三&#xff09;-Spring Boot的web開發SpringBoot詳解&#xff08;四&#xff09;-優雅地處理日志…

龍芯上跑WTM,為國產化做點貢獻

點擊上方藍字關注我哦“信創”&#xff0c;是一項國家戰略&#xff0c;即信息技術應用創新產業&#xff0c;它是數據安全、網絡安全的基礎&#xff0c;也是新基建的重要組成部分。信創從名稱上來看本意指向創新&#xff0c;但是自從漂亮國親手撕碎了“科技沒有國界”的謊言之后…

Class與Style綁定

對于數據綁定&#xff0c;一個常見的需求是操作元素的class列表和它的內聯樣式。因為它們都是attribute&#xff0c;我們可以用v-bind處理它們&#xff1a;只需要計算出表達式最終的字符串。不過&#xff0c;字符串拼接麻煩又易錯。因此&#xff0c;在v-bind用于class和style時…

PHP安裝之configure的配置參數

1、生成環境安裝配置如下 要求安裝如下庫&#xff1a; imagickgdmysqlmysqlimysqlndphalconPharsoapsocketsxwebxsvczipzlib 具體查看 vim php-config 就可以知道是如何配置的 --prefix/home/php --with-config-file-path/home/php/etc --with-mysql --with-pdo-oci --with-ope…

Django05: 請求生命周期流程圖/路由層

請求生命周期流程圖 擴展知識&#xff1a; 緩存數據庫 路由層 路由匹配 url(r^test/, views.test), 1. 第一個參數是正則匹配。 只要第一個匹配了&#xff0c;就不會執行下面。 輸入url會默認加斜杠&#xff0c;django會重定向 a. 一次匹配不行 b. url再加斜杠匹配 可以…

facebook 分享頁面_Facebook個人資料,頁面和組之間有什么區別?

facebook 分享頁面Facebook is used by a lot of different people for a lot of different things, so it’s only natural that Facebook would have different sets of features for each of them. There are three main ways you can use Facebook: with a regular Profile…

zabbix運行腳本監控ggsci報錯

/u01/app/oracle/oracle/ogg/ggsci: error while loading shared libraries: libdb-6.1.so: cannot open shared object file: No such file or directory增加腳本環境變量設置PATH$PATH:$HOME/binexport ORACLE_BASE/u01/app/oracleexport ORACLE_HOME$ORACLE_BASE/11/db_1exp…

一句話設計原則

面向對象的可復用設計&#xff08; Object Oriented Design / OOD&#xff09; 1. 開閉原則 (Open Closed Principle) 對擴展開放&#xff0c;對修改關閉 2. 里氏代換原則(LSP) 1.可以使用基類的地方&#xff0c;其子類必然也能使用 2.并且原功能不會受到任何影響 -- 經典案例,…