dotnet tool

发布时间 2023-12-13 23:13:32作者: euv

dotnet tool 下载Console应用,可以在终端以命令行调用传参执行任务。

全局工具

dotnet tool intsall powershell --global

安装工具并自动将可执行文件的所在目录添加到用户PATH环境变量。全局工具二进制文件默认安装目录

(OS) 路径
Linux/macOS $HOME/.dotnet/tools
Windows %USERPROFILE%\.dotnet\tools (C:\Users\euv\.dotnet\tools)

pwsh -c ls

在任意目录可调用pwsh.exe,因为安装时已添加环境变量。(‪C:\Users\euv.dotnet\tools\pwsh.exe)

dotnet tool list -g

列出所有已安装的全局工具

本地工具

全局工具至少有以下2个缺点:

  1. 全局工具是公有的,如果想使用非全局工具版本,更新工具会影响所有使用全局工具的第三方。

  2. 全局工具会在主机添加环境变量,如果动辄安装各种全局工具临时使用数次而已,会导致大量冗余环境变量。

可以安装本地工具,在特定目录下使用本目录独享的工具实例。

先在目录下构建工具清单文档.config/dotnet-tools.json,安装,卸载,更新工具都会反馈到此文件。在目录以及其子目录下调用工具都会使用清单中列出的版本。

# 先创建清单文件
dotnet new tool-manifest --output "D:\test"
# D:\test\.config\dotnet-tools.json

# 安装
dotnet tool install powershell --local --tool-manifest "D:\test\.config\dotnet-tools.json"

# 更新
dotnet tool update powershell --local --tool-manifest "D:\test\.config\dotnet-tools.json"

# 卸载
dotnet tool uninstall powershell --local --tool-manifest "D:\test\.config\dotnet-tools.json"

# 使用
dotnet pwsh

dotnet-tools.json文档的内容样例

{
  "version": 1,
  "isRoot": true,
  "tools": {
    "powershell": {
      "version": "7.4.0",
      "commands": [
        "pwsh"
      ]
    }
  }
}

使用本地工具,先把终端的当前目录切换到目标目录下,再调用工具。

假设有下面目录结构

  • D:\
    • project\
      • .config\dotnet-tools.json
      • dir1
      • dir2
        • .config\dotnet-tools.json

终端命令行的当前目录是D:\project\dir2,执行dotnet pwsh,先检索D:\project\dir2.config\dotnet-tools.json中是否有powershell,有则调用,无则检查isRoot,true,停止检索报错无此工具,false则在父目录中检索清单文件。

isRoot

理论上,目标目录下的dotnet-tool.json的isRoot是true.

本地工具存储在$HOME/.dotnet/toolResolverCache

dotnet tool restore

本地工具的安装位置

Nuget包可分3类,如下图nuget.org官网搜查筛选选项:

.Net Local Tool本质是一种Console App性质的Nuget包,和Dependency Library的Nuget包一样,被下载到 global NuGet package folder,即$HOME\.nuget\packages(C:\Users\euv\.nuget\packages\)。

.net tool nuget路径样例

C:\Users\euv\.nuget\packages\dotnet-serve\1.10.172\tools\net6.0\any\dotnet-serve.dll

dependency library nuget路径样例

C:\Users\euv\.nuget\packages\newtonsoft.json\13.0.3\lib\net6.0\Newtonsoft.Json.dll

差异点:$HOME\.nuget\packages\package id\version\lib | tools

多个project引用或多个dotnet-tool.json包含特定版本的nuget,但是只会一份。从某个dotnet-tool.json卸载Local Tool或一出nuget reference,并不会导致Nuget从全局缓存卸载,需要手动删除clear nuget。

运行global tool 和 local tool的区别

任务管理器 --> 详细信息

PS D:\OneDrive\Desktop> dotnet dotnet-serve
Starting server, serving .
Listening on any IP:
  http://localhost:53524

Press CTRL+C to exit
进程名称 路径 命令行
dotnet.exe C:\Program Files\dotnet.exe “C:\Program Files\dotnet.exe” ‪C:\Users\euv.nuget\packages\dotnet-serve\1.10.172\tools\net6.0\any\dotnet-serve.dll
PS D:\OneDrive\Desktop> dotnet-serve
Starting server, serving .
Listening on any IP:
  http://localhost:53558

Press CTRL+C to exit
进程名称 路径 命令行
dotnet-serve.exe C:\users\euv\.dotnet\tools\dotnet-serve.exe “C:\users\euv\.dotnet\tools\dotnet-serve.exe”