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个缺点:
-
全局工具是公有的,如果想使用非全局工具版本,更新工具会影响所有使用全局工具的第三方。
-
全局工具会在主机添加环境变量,如果动辄安装各种全局工具临时使用数次而已,会导致大量冗余环境变量。
可以安装本地工具,在特定目录下使用本目录独享的工具实例。
先在目录下构建工具清单文档.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
- project\
终端命令行的当前目录是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” |