在Nuget uninstall.ps1期间删除PropertyGroup

时间:2013-02-03 19:34:50

标签: powershell nuget

我有一个Nuget包,可以在安装过程中向项目XML添加一些MSBuild条目。这很好,产生以下(以及其他条目):

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

但是,我在卸载期间删除属性(及其生成的组元素)时遇到问题。我的PowerShell-fu留下了很多不足之处,但到目前为止我已经尝试了几种方法:

  1. 删除所有PropertyGroup元素,这些元素至少有一个名为JsCompilationToolsPath;
  2. 的Property元素
  3. 删除名为JsCompilationToolsPath的所有Property元素,然后删除所有没有子元素的PropertyGroup元素;
  4. 只需删除指定的Property对象。
  5. 以下是后一种尝试:

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

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

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

1 个答案:

答案 0 :(得分: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()来完成的。Parent需要存在,因为您要删除属性组本身,而不仅仅是属性。