重建sln的项目层级

打印 上一主题 下一主题

主题 850|帖子 850|积分 2550

编写包含多个 csproj 的程序时,随着项目数量的持续增加,可能涉及一些文件夹的变动,手动添加项目或者变动会变得非常麻烦,这个时候,可以利用 dotnet cli 帮助我们完成。
如果从零开始,我们可以新建一个解决方案。
  1. dotnet new sln -n todo.sln
复制代码
然后添加当前目录内的所有 csproj 文件到解决方案。
  1. $rootDir = Get-Location
  2. $solutionFile = "$rootDir\todo.sln"
  3. Get-ChildItem -Recurse -Filter *.csproj | ForEach-Object {
  4.     $projectFile = $_.FullName
  5.     $relativePath = $_.DirectoryName.Replace($rootDir, "").TrimStart("")
  6.     $solutionFolder = if ($relativePath) { "\$relativePath" } else { "" }
  7.     dotnet sln $solutionFile add $projectFile --solution-folder $solutionFolder
  8. }
复制代码
这样生成的项目会保留每一个文件夹结构(解决方案文件夹),与 Visual Studio 的默认行为不同(会忽略与项目同名的解决方案文件夹创建)。
其实简单一些,直接使用这个命令就可以了:
  1. dotnet sln todo.sln add (ls -r **/*.csproj)
复制代码
这个命令等效于:
  1. $rootDir = Get-Location
  2. $solutionFile = "$rootDir\todo.sln"
  3. Get-ChildItem -Recurse -Filter *.csproj | ForEach-Object {
  4.     $projectFile = $_.FullName
  5.     $parentDirectoryName = Split-Path $_.DirectoryName -Leaf
  6.     if ($_.Name -eq "$parentDirectoryName.csproj") {
  7.         if($_.DirectoryName -ne $rootDir){
  8.             $parentSolutionFolder = (Split-Path $_.DirectoryName -Parent).Replace($rootDir, "").TrimStart("")
  9.             $solutionFolder = if ($parentSolutionFolder) { "\$parentSolutionFolder" } else { "" }
  10.         }
  11.         else{
  12.             $solutionFolder = ""
  13.         }
  14.     } else {
  15.         $relativePath = $_.DirectoryName.Replace($rootDir, "").TrimStart("")
  16.         $solutionFolder = if ($relativePath) { "\$relativePath" } else { "" }
  17.     }
  18.     dotnet sln $solutionFile add $projectFile --solution-folder $solutionFolder
  19. }
复制代码
上面这个感觉很复杂,不过相当于给出了每一个步骤,如果后期有其他需求,可以在上面代码的基础上进行调整与改进。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

渣渣兔

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表