1. 为什么需要掌握dotnet命令行工具
作为C#开发者,我们大多数时间都习惯在Visual Studio这样的IDE中工作。但真实的生产环境中,命令行工具才是持续集成、自动化部署和跨平台开发的基石。上周我在为一个ARM架构的嵌入式设备部署.NET服务时,就深刻体会到了命令行工具的重要性——那个环境根本没有图形界面。
dotnet CLI(命令行界面)是.NET Core及后续版本的核心工具链,它允许你:
- 不依赖IDE创建、构建、运行和发布项目
- 管理NuGet包和项目依赖
- 运行单元测试和性能分析
- 跨平台操作(Windows/Linux/macOS/ARM)
提示:即使在Windows开发环境中,掌握命令行也能让你在VS卡顿时快速验证想法,我经常用终端测试代码片段,效率比反复编译项目高得多。
2. 环境准备与基础命令
2.1 安装.NET SDK
首先确保已安装最新版.NET SDK(当前稳定版是.NET 8):
# Windows winget install Microsoft.DotNet.SDK.8 # Linux (Ubuntu) wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb sudo dpkg -i packages-microsoft-prod.deb sudo apt update && sudo apt install dotnet-sdk-8.0 # Mac brew install --cask dotnet-sdk验证安装:
dotnet --version # 应输出类似 8.0.201 的版本号2.2 核心命令速查表
| 命令 | 作用 | 常用参数 |
|---|---|---|
dotnet new | 创建项目 | -o输出目录,--framework指定.NET版本 |
dotnet build | 编译项目 | -c Release发布模式编译 |
dotnet run | 运行项目 | --project指定项目文件 |
dotnet test | 运行测试 | --filter按条件筛选测试 |
dotnet publish | 发布应用 | -r指定运行时(如linux-arm) |
dotnet add package | 添加NuGet包 | --version指定包版本 |
3. 实战:从创建到部署完整流程
3.1 创建控制台应用
# 创建项目目录并进入 mkdir MyConsoleApp && cd MyConsoleApp # 创建控制台项目(使用C# 12特性) dotnet new console --use-program-main -f net8.0 # 添加必要NuGet包(示例:添加MQTT客户端) dotnet add package MQTTnet3.2 关键代码实现
修改Program.cs实现MQTT消息接收:
using MQTTnet; using MQTTnet.Client; var mqttFactory = new MqttFactory(); using var client = mqttFactory.CreateMqttClient(); var options = new MqttClientOptionsBuilder() .WithTcpServer("broker.hivemq.com") .Build(); client.ApplicationMessageReceivedAsync += e => { Console.WriteLine($"收到消息: {e.ApplicationMessage.ConvertPayloadToString()}"); return Task.CompletedTask; }; await client.ConnectAsync(options); await client.SubscribeAsync("myapp/#"); Console.ReadLine(); // 保持连接3.3 跨平台发布技巧
为不同平台生成可执行文件:
# Windows x64 dotnet publish -c Release -r win-x64 --self-contained true # Linux ARM(如树莓派) dotnet publish -c Release -r linux-arm --self-contained true # MacOS dotnet publish -c Release -r osx-x64 --self-contained false注意:
--self-contained true会包含运行时,使文件变大但无需目标机器安装.NET运行时。对于容器化部署建议设为false。
4. 高级应用场景解析
4.1 多项目管理解决方案
现代项目常采用分层架构,用命令行管理更高效:
MySolution/ ├── src/ │ ├── MyApp (主程序) │ ├── MyLib (类库) │ └── MyTests (测试项目) └── global.json关键操作:
# 创建解决方案文件 dotnet new sln -n MySolution # 添加项目引用 dotnet sln add src/MyApp/MyApp.csproj dotnet sln add src/MyLib/MyLib.csproj # 添加项目间引用 cd src/MyApp dotnet add reference ../MyLib/MyLib.csproj4.2 性能优化技巧
- 并行构建:
dotnet build -m:1 /p:Deterministic=true-m:1:使用1个CPU核心(避免服务器过载)/p:Deterministic=true:启用确定性构建
- 缓存优化:
export DOTNET_CLI_TELEMETRY_OPTOUT=1 # 禁用遥测提升速度 dotnet build-server shutdown # 清理构建服务器缓存5. 常见问题排坑指南
5.1 依赖冲突解决
当出现NU1605等版本冲突警告时:
# 查看依赖树 dotnet list package --include-transitive # 强制指定版本 dotnet add package Newtonsoft.Json --version 13.0.35.2 跨平台兼容性问题
案例:在ARM设备上运行时报错"System.IO.FileNotFoundException"
解决方案:
- 确认发布时指定了正确的运行时标识符(RID):
dotnet publish -r linux-arm- 检查依赖是否支持目标平台:
dotnet publish --sc -r linux-arm /p:PublishReadyToRun=true5.3 调试技巧
- 启用详细日志:
dotnet build --verbosity diagnostic- 内存分析:
# 生成内存转储 dotnet dump collect -p <PID> # 分析转储文件 dotnet dump analyze <dumpfile>6. 生产力提升工具链
6.1 实用工具推荐
- NuGet包搜索:
dotnet tool install -g dotnet-search dotnet search "mysql"- 项目模板管理:
# 列出已安装模板 dotnet new list # 安装第三方模板(如ASP.NET Core模板) dotnet new -i Microsoft.AspNetCore.Components.Templates6.2 自动化脚本示例
Windows批处理示例(build_and_deploy.bat):
@echo off set PROJECT_PATH=src\MyApp set PUBLISH_DIR=publish\win-x64 dotnet restore %PROJECT_PATH% dotnet build %PROJECT_PATH% -c Release dotnet publish %PROJECT_PATH% -c Release -r win-x64 -o %PUBLISH_DIR% xcopy /Y config %PUBLISH_DIR%\config\Linux Shell脚本示例:
#!/bin/bash PROJECT_PATH="src/MyApp" PUBLISH_DIR="publish/linux-arm" dotnet restore $PROJECT_PATH dotnet build $PROJECT_PATH -c Release dotnet publish $PROJECT_PATH -c Release -r linux-arm -o $PUBLISH_DIR # 设置可执行权限 chmod +x $PUBLISH_DIR/MyApp7. 安全最佳实践
- 敏感信息处理:
# 使用Secret Manager(开发环境) dotnet user-secrets init dotnet user-secrets set "Mqtt:Password" "123456" # 生产环境推荐使用环境变量 export MQTT__PASSWORD="securepassword"- 依赖安全检查:
# 检查已知漏洞 dotnet list package --vulnerable # 更新所有包 dotnet outdated -u8. 性能监控与优化
8.1 运行时监控
# 实时监控CPU/内存 dotnet counters monitor --process-id <PID> System.Runtime # 生成性能报告 dotnet trace collect -p <PID> --format speedscope8.2 编译优化
在.csproj中添加:
<PropertyGroup> <Optimize>true</Optimize> <DebugType>embedded</DebugType> <InvariantGlobalization>true</InvariantGlobalization> </PropertyGroup>9. 容器化部署实战
9.1 Dockerfile示例
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src COPY . . RUN dotnet publish "MyApp.csproj" -c Release -o /app FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app COPY --from=build /app . ENTRYPOINT ["dotnet", "MyApp.dll"]构建命令:
docker build -t myapp . docker run -it --rm -p 8080:80 myapp9.2 多阶段构建优化
# 第一阶段:还原 FROM mcr.microsoft.com/dotnet/sdk:8.0 AS restore WORKDIR /src COPY *.sln . COPY */*.csproj ./ RUN for file in $(ls *.csproj); do mkdir -p ${file%.*}/ && mv $file ${file%.*}/; done RUN dotnet restore # 第二阶段:构建 FROM restore AS build COPY . . RUN dotnet build -c Release --no-restore # 第三阶段:发布 FROM build AS publish RUN dotnet publish -c Release -o /app --no-restore # 最终阶段:运行时 FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "MyApp.dll"]10. 持续集成配置
10.1 GitHub Actions示例
name: Build and Test on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup .NET uses: actions/setup-dotnet@v3 with: dotnet-version: 8.0.x - name: Restore dependencies run: dotnet restore - name: Build run: dotnet build --configuration Release --no-restore - name: Test run: dotnet test --no-build --verbosity normal - name: Publish run: dotnet publish -c Release -o published - name: Upload Artifact uses: actions/upload-artifact@v3 with: name: myapp path: published10.2 自定义构建管道
对于复杂项目,可以创建专用构建脚本:
#!/bin/bash # build.sh # 参数检查 if [ -z "$1" ]; then echo "Usage: $0 <version>" exit 1 fi VERSION=$1 OUTPUT_DIR="artifacts/$VERSION" # 清理旧构建 rm -rf "$OUTPUT_DIR" mkdir -p "$OUTPUT_DIR" # 并行构建各项目 dotnet build src/MyApp -c Release -p:Version=$VERSION -o "$OUTPUT_DIR/app" & dotnet build src/MyLib -c Release -p:Version=$VERSION -o "$OUTPUT_DIR/lib" & wait # 生成校验和 cd "$OUTPUT_DIR" && sha256sum * > checksums.sha256