如何在.NET 8项目dotnet build过程中自动生成JSON文件?
可行,实现方案如下
1. 在.NET项目中配置构建时自动生成JSON
直接修改项目的.csproj文件,添加MSBuild目标,在构建流程中触发自定义命令生成JSON文件:
<Target Name="GeneratePermissionsJson" AfterTargets="Build" Condition="'$(Configuration)' == 'Release'"> <!-- 调用自定义工具生成JSON,示例中工具为同解决方案下的控制台项目 --> <Exec Command="dotnet run --project $(SolutionDir)PermissionsGenerator/PermissionsGenerator.csproj -- $(ProjectDir)Permissions.cs $(OutputPath)permissions.json" /> </Target>
编写生成JSON的工具示例
用Roslyn解析C#静态类的核心代码(控制台项目),需先安装Microsoft.CodeAnalysis.CSharp NuGet包:
using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using System.Text.Json; var inputFilePath = args[0]; var outputFilePath = args[1]; // 读取静态类代码文件 var code = File.ReadAllText(inputFilePath); var syntaxTree = CSharpSyntaxTree.ParseText(code); // 编译代码以获取语义信息 var compilation = CSharpCompilation.Create("PermissionsCompilation") .AddReferences(MetadataReference.CreateFromFile(typeof(object).Assembly.Location)) .AddSyntaxTrees(syntaxTree); var semanticModel = compilation.GetSemanticModel(syntaxTree); // 定位目标静态类 var staticClass = syntaxTree.GetRoot().DescendantNodes() .OfType<ClassDeclarationSyntax>() .First(c => c.Modifiers.Any(SyntaxKind.StaticKeyword)); var classSymbol = semanticModel.GetDeclaredSymbol(staticClass); // 提取静态类中的常量属性与值 var permissionData = new Dictionary<string, object>(); foreach (var field in classSymbol.GetMembers().OfType<IFieldSymbol>().Where(f => f.IsConst)) { permissionData[field.Name] = field.ConstantValue; } // 生成并写入JSON文件 var jsonContent = JsonSerializer.Serialize(permissionData, new JsonSerializerOptions { WriteIndented = true }); File.WriteAllText(outputFilePath, jsonContent);
2. 配置GitHub Action自动推送
在仓库的.github/workflows/build-and-push.yml中添加工作流,完成构建、生成JSON后自动推送:
name: Build & Push Permissions JSON on: push: branches: [ main ] jobs: build-and-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup .NET 8 uses: actions/setup-dotnet@v4 with: dotnet-version: 8.0.x - name: Restore dependencies run: dotnet restore - name: Build project (and generate JSON) run: dotnet build --configuration Release --no-restore - name: Push JSON to target service run: | # 替换为实际推送命令,示例为通过curl上传到API curl -X POST https://your-target-service.com/api/permissions \ -H "Authorization: Bearer ${{ secrets.TARGET_SERVICE_TOKEN }}" \ -H "Content-Type: application/json" \ -d @./YourProject/bin/Release/net8.0/permissions.json
如果需要推送到另一个GitHub仓库,可调整步骤如下:
- name: Checkout target repo uses: actions/checkout@v4 with: repository: your-org/target-repo token: ${{ secrets.TARGET_REPO_ACCESS_TOKEN }} path: target-repo - name: Copy JSON file to target repo run: cp ./YourProject/bin/Release/net8.0/permissions.json ./target-repo/permissions.json - name: Commit and push changes run: | cd target-repo git config user.name "GitHub Action" git config user.email "action@github.com" git add permissions.json git commit -m "Update permissions JSON from source repo" git push
注意事项
- 若生成工具是解决方案内的项目,需在主项目的
.csproj中添加项目引用,并设置ProjectReferenceOutputAssembly="false",确保工具先于主项目构建。 - GitHub Action中用到的敏感信息(如服务令牌、仓库访问令牌)需存储在仓库的Secrets中,避免明文暴露。
- 可通过MSBuild的
Condition属性控制生成逻辑的触发时机,比如仅在Release构建时执行。
内容的提问来源于stack exchange,提问作者Perrier
相关产品推荐
相关产品推荐

