使用PowerShell修改C#项目文件中的包版本

问题描述 投票:0回答:1

我想使用 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
文件

c# powershell visual-studio
1个回答
0
投票

给出示例 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)
}
© www.soinside.com 2019 - 2024. All rights reserved.