我有一个Nuget包,可以在安装过程中向项目XML添加一些MSBuild条目。这很好,产生以下(以及其他条目):
<PropertyGroup>
<JsCompilationToolsPath>some/path/determined/at/runtime</JsCompilationToolsPath>
</PropertyGroup>
但是,我在卸载期间删除属性(及其生成的组元素)时遇到问题。我的PowerShell-fu留下了很多不足之处,但到目前为止我已经尝试了几种方法:
JsCompilationToolsPath
; JsCompilationToolsPath
的所有Property元素,然后删除所有没有子元素的PropertyGroup元素; 以下是后一种尝试:
$msBuildProject.Properties | Where-Object { $_.Name -eq "JsCompilationToolsPath" } | ForEach-Object { $msBuildProject.RemoveProperty($_) }
这些方法都没有任何效果;该脚本运行时没有错误,但不删除属性元素。
通过PowerShell删除MSBuild属性的正确方法是什么?
答案 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
需要存在,因为您要删除属性组本身,而不仅仅是属性。