我想使用 PowerShell 修改我们的一些软件包的版本。使用此脚本,如果我只传递版本号,它就可以工作,但可能有其他具有相同版本的软件包我们不想更新。 首先,软件包名称将以
Utilities
开头
如何修改此脚本来修改这两个包引用?即我想在传入的文件下的所有子目录中的所有 .csproj 文件中将此包的版本更新为
0.1.5.16-develop
。
<PackageReference Include="Utilities.Exceptions">
<Version>0.1.5.14-develop</Version>
</PackageReference>
<PackageReference Include="Utilities.Exceptions" Version="0.1.5.14-develop" />
PowerShell 脚本:
$directory = $args[0]
$searchString = $args[1]
$replaceString = $args[2]
Get-ChildItem -Path $directory -Filter *.csproj -Recurse | ForEach-Object {
$fileContent = Get-Content $_.FullName
$fileContent = $fileContent -replace $searchString, $replaceString
$fileContent | Set-Content $_.FullName
}
我知道这里的解决方案:跨多个项目/解决方案更新 NuGet 包,但我们不使用
packages.config
文件
给出示例 Csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PackageReference Include="Utilities.Exceptions">
<Version>0.1.5.14-develop</Version>
</PackageReference>
<PackageReference Include="Utilities.Exceptions" Version="0.1.5.14-develop" />
<!-- adding other package for testing -->
<PackageReference Include="PowerShellStandard.Library" Version="5.1.1" PrivateAssets="all" />
</Project>
假设我们将其存储在当前位置的文件
test.xml
中,您可以使用以下过滤表达式来获取和更新两个节点:
$path = Convert-Path .\test.xml
$xml = [xml]::new()
$xml.Load($path)
$packageName = 'Utilities.Exceptions'
$packageVersion = '0.1.5.14-develop'
$newVersion = '1.1.1.1'
$filter = @"
//PackageReference[@Include='$packageName' and @Version='$packageVersion'] |
//PackageReference[@Include='$packageName'][Version[text()='$packageVersion']]
"@
$xml.SelectNodes($filter) | ForEach-Object { $_.Version = $newVersion }
$xml.InnerXml
这将产生以下输出:
<Project Sdk="Microsoft.NET.Sdk">
<PackageReference Include="Utilities.Exceptions">
<Version>1.1.1.1</Version>
</PackageReference>
<PackageReference Include="Utilities.Exceptions" Version="1.1.1.1" />
<!-- adding other package for testing -->
<PackageReference Include="PowerShellStandard.Library" Version="5.1.1" PrivateAssets="all" />
</Project>
如果您想将此逻辑应用于您可以使用的所有 Csproj 文件:
param($directory, $packageName, $packageVersion, $newVersion)
$filter = @"
//PackageReference[@Include='$packageName' and @Version='$packageVersion'] |
//PackageReference[@Include='$packageName'][Version[text()='$packageVersion']]
"@
Get-ChildItem -Path $directory -Filter *.csproj -Recurse | ForEach-Object {
$xml = [xml]::new()
$xml.Load($_.FullName)
foreach ($node in $xml.SelectNodes($filter)) {
$node.Version = $newVersion
}
$xml.Save($_.FullName)
}