0

我有一个 Nuget 包,它在安装期间将一些 MSBuild 条目添加到项目 XML 中。这工作正常,产生以下(以及其他条目):

<PropertyGroup>
    <JsCompilationToolsPath>some/path/determined/at/runtime</JsCompilationToolsPath>
</PropertyGroup>

但是,我在卸载期间无法删除该属性(及其生成的组元素)。我的 PowerShell-fu 有很多不足之处,但到目前为止我已经尝试了一些方法:

  1. 删除所有至少具有一个名为的 Property 元素的 PropertyGroup 元素JsCompilationToolsPath
  2. 移除所有已命名的 Property 元素JsCompilationToolsPath,然后移除所有没有子元素的 PropertyGroup 元素;
  3. 只需删除命名的 Property 对象。

这是后一种尝试:

$msBuildProject.Properties | Where-Object { $_.Name -eq "JsCompilationToolsPath" } | ForEach-Object { $msBuildProject.RemoveProperty($_) }

这些方法都没有任何效果;脚本运行没有错误,但没有删除属性元素。

通过 PowerShell 删除 MSBuild 属性的正确方法是什么?

4

1 回答 1

1

我想出了以下内容:

param($installPath, $toolsPath, $package, $project)

Set-StrictMode -Version Latest

function RemoveMatchingPropertyGroups($buildProject, $property)
{
    foreach ($pg in $buildProject.Xml.PropertyGroups)
    {
        $firstChild = $pg.FirstChild.Name
        if ($property -eq $firstChild)
        {
            Write-Host "Removing old $firstChild"
            try
            {
                $pg.Parent.RemoveChild($pg)
            }
            catch
            {
            }
        }
    }
} 

Add-Type -AssemblyName 'Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
$buildProject = [Microsoft.Build.Evaluation.ProjectCollection]::GlobalProjectCollection.GetLoadedProjects($project.FullName) | Select-Object -First 1

RemoveMatchingPropertyGroups $buildProject "JsCompilationToolsPath"

您基本上需要加载 msbuild 引擎 dll,然后遍历所有属性组,如果PropertyGroup.FirstChild.Name匹配,您可以删除属性组。这是通过调用PropertyGroup.Parent.RemoveChild()The Parentneeds to be there 来完成的,因为您想要删除属性组本身,而不仅仅是属性。

于 2013-08-22T10:36:55.177 回答