多仓库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
相关产品推荐
相关产品推荐

