一、需求
产品在生命周期中可能会更改名称,比如产品从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) }
四、总结
面对大量的、有规律的、重复工作,脚本是一个很好的工具,善用它会带来成倍的工作效率提升。
标签:解决方案,Company,项目名称,名称,Product1,csproj,net,PowerShell From: https://www.cnblogs.com/maomu/p/17447332.html