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

多仓库GitHub Actions中.NET主项目还原依赖失败排查

问题诊断与修复方案

核心问题

主项目dotnet restore失败的关键原因有两个:

  • 硬编码Windows路径替换完全失效:GitHub Actions的Ubuntu runner用的是Linux文件系统,路径格式是/home/runner/work/仓库名/仓库名/,但你脚本里硬编码了Windows风格的D:/a/Master.NET/Master.NET/,导致路径替换根本没生效,解决方案文件里的旧路径依然存在。
  • 相对路径逻辑错误:三个仓库被检出到工作目录的同级位置(Child1.NET、Child2.NET、Master.NET),主解决方案应该用../Child1.NET/xxx.csproj这种相对路径引用子项目,而不是当前脚本试图生成的路径。

修复步骤

1. 替换硬编码路径逻辑,生成正确相对路径

修改Update Master.NET.sln File步骤的脚本,不再依赖硬编码绝对路径,直接基于主解决方案的位置计算子项目的相对路径:

- name: Update Master.NET.sln File
  run: |
    # 获取主解决方案所在目录
    $masterDir = Split-Path -Path $env:MASTER_SOLUTION_PATH -Parent
    # 计算子项目相对于主解决方案目录的路径
    $child2RelativePath = Resolve-Path -Path $env:CHILD_2_PATH -Relative -RelativeBasePath $masterDir
    $child1RelativePath = Resolve-Path -Path $env:CHILD1_NET_PATH -Relative -RelativeBasePath $masterDir
    # 替换解决方案文件中的路径(统一转成斜杠格式)
    (Get-Content $env:MASTER_SOLUTION_PATH) `
    -replace '..\\Child2.NET\\Child2.NET.csproj', $child2RelativePath.replace('\','/') `
    -replace '..\\Child1.NET\\Child1.NET\\Child1.NET.csproj', $child1RelativePath.replace('\','/') `
    | Set-Content $env:MASTER_SOLUTION_PATH
  shell: pwsh

2. 切换工作目录执行主项目restore(推荐)

执行主项目restore时,切换到主解决方案所在目录,避免路径歧义:

- name: Restore Dependencies for Master.NET
  run: dotnet restore
  working-directory: Master.NET

3. 简化路径定位步骤(可选)

如果项目结构固定,可以去掉递归查找,直接写死路径,减少不确定性:

- name: Locate Child2.NET.csproj and Child1.NET.csproj Paths
  run: |
    echo "CHILD_2_PATH=Child2.NET/Child2.NET.csproj" | Out-File -Append -FilePath $env:GITHUB_ENV
    echo "CHILD1_NET_PATH=Child1.NET/Child1.NET/Child1.NET.csproj" | Out-File -Append -FilePath $env:GITHUB_ENV
  shell: pwsh

- name: Locate Master.NET.sln File and Store Path
  run: |
    echo "MASTER_SOLUTION_PATH=Master.NET/Master.NET.sln" | Out-File -Append -FilePath $env:GITHUB_ENV
  shell: pwsh

修复后的关键YAML片段

# ... 前面的checkout和setup步骤保持不变 ...

- name: Locate Child2.NET.csproj and Child1.NET.csproj Paths
  run: |
    echo "CHILD_2_PATH=Child2.NET/Child2.NET.csproj" | Out-File -Append -FilePath $env:GITHUB_ENV
    echo "CHILD1_NET_PATH=Child1.NET/Child1.NET/Child1.NET.csproj" | Out-File -Append -FilePath $env:GITHUB_ENV
  shell: pwsh

- name: Locate Master.NET.sln File and Store Path
  run: |
    echo "MASTER_SOLUTION_PATH=Master.NET/Master.NET.sln" | Out-File -Append -FilePath $env:GITHUB_ENV
  shell: pwsh

- name: Update Master.NET.sln File
  run: |
    $masterDir = Split-Path -Path $env:MASTER_SOLUTION_PATH -Parent
    $child2RelativePath = Resolve-Path -Path $env:CHILD_2_PATH -Relative -RelativeBasePath $masterDir
    $child1RelativePath = Resolve-Path -Path $env:CHILD1_NET_PATH -Relative -RelativeBasePath $masterDir
    (Get-Content $env:MASTER_SOLUTION_PATH) `
    -replace '..\\Child2.NET\\Child2.NET.csproj', $child2RelativePath.replace('\','/') `
    -replace '..\\Child1.NET\\Child1.NET\\Child1.NET.csproj', $child1RelativePath.replace('\','/') `
    | Set-Content $env:MASTER_SOLUTION_PATH
  shell: pwsh

- name: Restore Dependencies for Master.NET
  run: dotnet restore
  working-directory: Master.NET

- name: Build Master.NET
  run: dotnet build --no-restore --configuration Release
  working-directory: Master.NET

内容的提问来源于stack exchange,提问作者DanConsultant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:54:52