You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 19:58:34