PowerShell实战系列:按需更改.net解决方案中的项目名称

发布时间 2023-05-31 23:04:44作者: 毛姆

一、需求

    产品在生命周期中可能会更改名称,比如产品从Product1升级为Product2,为了使产品代码与之同步,产品源码项目名称需要改动,通常一个产品由包含很多项目,手动更改有很大的工作量,且未来该工作仍可能重复(产品继续升级,带来改名需求)。

    对于大量且重复的工作,编写脚本可有效满足此类场景需求,本文选择使用PowerShell解决上述需求的问题。

二、问题分析

    通过案例,分析需求含有哪些具体问题,创建解决方案:Product1,并创建5个项目,项目结构如下:

    本着以终为始的原则,希望最终看到的效果:

1、拆解子问题:

(1)文件目录名称需要改动,将旧文件目录名称改为新文件目录名称

(2)解决方案名称需要改变,将旧解决方案名称改为新解决方案名称

(3)解决方案的项目文件*.csproj需要改动,将旧项目名称改为新项目名称

(4)*.sln文件内容需要改动,旧项目名称要改为新项目名称

(5)*.csproj中的文件内容需要改动,因为项目间的引用使用旧项目名称,需要将旧项目名称要改为新项目名称

2、问题1-3,涉及文件夹、文件名称更改:

(1)Product1.sln改为Product2.sln

(2)Company.Product1.Web改为Company.Product1.Web

(3)Company.Product1.Web.csproj改为Company.Product2.Web.csproj

3、问题4-5,文件名称改完后,涉及文件内容更改:

(1)Product2.sln中旧项目名称Company.Product1.Web.csproj改为Company.Product2.Web.csproj

(2)Company.Product2.Web.csproj中旧项目名称Company.Product1.Core改为Company.Product2.Core

三、解决方案

1、针对问题1-3,解决思路:

    通过PowerShell遍历解决方案目录,并递归,将匹配名称的文件夹、文件过滤出来,通过正则匹配,用新名称替换掉旧名称。

2、针对问题4-5,解决思路:

    通过PowerShell遍历解决方案目录,并递归,将匹配名称的解决方案文件(*.sln)、项目文件(*.csproj)读取出文件内容,通过正则匹配,用新名称替换掉旧名称,将更改后的内容重新写入到对应的解决方案文件(*.sln)、项目文件(*.csproj)。

3、具体实现代码:

$solutionDir = "D:\Product1" 
$oldName = "Product1"
$newName = "Product2"

$regexOldName="*"+$oldName+"*"

#替换项目文件夹名称
Get-ChildItem -Path $solutionDir -Filter $regexOldName -Recurse | Rename-Item -NewName {$_.Name -replace $oldName,$newName}

#替换项目文件内容中的名称
(Get-ChildItem -Path $solutionDir -Include *.csproj -Recurse).FullName | ForEach-Object {
    $content = [System.IO.File]::ReadAllText($_)
    $content = $content -replace $oldName, $newName
    [System.IO.File]::WriteAllText($_, $content)
}

#替换解决方案文件内容中的名称
(Get-ChildItem -Path $solutionDir -Include *.sln -Recurse).FullName | ForEach-Object {
    $content = [System.IO.File]::ReadAllText($_)
    $content = $content -replace $oldName, $newName
    [System.IO.File]::WriteAllText($_, $content)
}

  

四、总结

    面对大量的、有规律的、重复工作,脚本是一个很好的工具,善用它会带来成倍的工作效率提升。