2013-02-03 33 views
0

我有一个Nuget包,它在安装过程中将一些MSBuild条目添加到项目XML中。这工作得很好,产生以下(其他项中):在Nuget中删除PropertyGroup uninstall.ps1

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

但是,我无法卸载过程中移除属性(及其导致的组元素)。我PowerShell的复极不理想很多,但到目前为止,我已经尝试了几种方法:

  1. 删除其中至少有一个属性元素命名为JsCompilationToolsPath所有的PropertyGroup元素;
  2. 删除名为JsCompilationToolsPath的所有属性元素,然后删除没有子元素的所有PropertyGroup元素;
  3. 只需删除指定的Property对象。

这里是后者的尝试:

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

的方法都没有任何影响;脚本运行时没有错误,但属性元素不会被删除。

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

回答

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。这是通过调用PropertyGroup.Parent.RemoveChild()来完成的Parent需要在那里,因为你想删除属性组本身,而不仅仅是属性。

相关问题