Wie kann ich Powershell verwenden, um hinzuzufügen/entfernen Sie Verweise auf eine csproj?
In Bezug auf diese Vorherige Frage ich bin versucht, eine batch-Datei erstellen, die als Teil entfernen müssen, und fügen Sie eine Referenz zu einem XML *.csproj-Datei. Ich habe mir bei diese, diese, diese und diese Vorherige Frage, sondern als ein powershell n00b bin nicht in der Lage, um es arbeiten (so weit).
Kann mir jemand helfen mit dem folgenden? Ich möchte zu entfernen, zwei spezifische Referenzen in einem VS2010-csproj-Datei (XML) und fügen Sie eine neue Referenz.
Öffnete ich die csproj und der Bezug kann am folgenden Speicherort gefunden
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- ... -->
<!-- Omitted for brevity -->
<!-- ... -->
<ItemGroup Condition="'$(BuildingInsideVisualStudio)' == 'true'">
<AvailableItemName Include="Effect" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\SomeDirectory\SomeProjectFile.csproj">
<Project>{AAB784E4-F8C6-4324-ABC0-6E9E0F73E575}</Project>
<Name>SomeProject</Name>
</ProjectReference>
<ProjectReference Include="..\AnotherDirectory\AnotherProjectFile.csproj">
<Project>{B0AA6A94-6784-4221-81F0-244A68C374C0}</Project>
<Name>AnotherProject</Name>
</ProjectReference>
</ItemGroup>
<!-- ... -->
<!-- Omitted for brevity -->
<!-- ... -->
</Project>
Grundsätzlich möchte ich:
- entfernen Sie diese beiden Referenzen
- legen Sie eine neue Referenz, um eine vorkompilierte DLL mit dem angegebenen relativen Pfad
- ODER Fügen Sie einen Assemblyverweis Ort, um das Projekt angegebenen relativen Pfad
Als ein sehr einfaches Beispiel, ich habe versucht, das folgende powershell-Skript zum löschen aller ProjectReference Knoten. Gebe ich den Pfad zur csproj als argument. Ich bekomme die Fehlermeldung Cannot validate the argument 'XML'. The Argument is null or empty
. Kann ich bestätigen, es ist laden Sie die csproj-und speichern Sie Sie in-place-unverändert, so dass der Pfad korrekt ist.
param($path)
$MsbNS = @{msb = 'http://schemas.microsoft.com/developer/msbuild/2003'}
function RemoveElement([xml]$Project, [string]$XPath, [switch]$SingleNode)
{
$xml | Select-Xml -XPath $XPath | ForEach-Object{$_.Node.ParentNode.RemoveAll()}
}
$proj = [xml](Get-Content $path)
[System.Console]::WriteLine("Loaded project {0} into {1}", $path, $proj)
RemoveElement $proj "//ProjectReference" -SingleNode
# Also tried
# RemoveElement $proj "/Project/ItemGroup/ProjectReference[@Include=`'..\SomeDirectory\SomeProjectFile.csproj`']" -SingleNode
# but complains cannot find XPath
$proj.Save($path)
Was mache ich falsch? Irgendwelche Kommentare/Vorschläge erwünscht 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, das problem ist, dass die XML-Datei hat eine Standard-namespace
xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
. Dies führt zu Problemen mit XPath. Damit Sie XPath -//ProjectReference
0 zurück Knoten. Es gibt zwei Möglichkeiten, um dieses Problem zu lösen:Hier ist, wie könnte man eine namespace-manager:
Oder:
Hier ist, wie es zu tun using namespace Agnostiker XPath:
Oder:
Dem zweiten Ansatz kann gefährlich sein, weil, wenn es mehr als einen Namensraum auswählen könnte den falschen Knoten, aber nicht Ihr Fall.
proj.NameTable' and
nsmgr.AddNamespace " und bekamSystem.Xml.Nametable doesn't contain a method named AddNamespace
[System.Xml.XmlNamespaceManager] $nsmgr = $proj.NameTable
funktioniert. Ok, die Arbeit durch das entfernen der Knoten. Scheint das auswählen von Knoten ohne FehlerAddReference.ps1
RemoveReference.ps1
[system.console]::WriteLine
können Sie dieWrite-Host
cmdlet z.B.Write-Host ("This is {0} typing" -f "less")
.-f
ist für die string-Formatierung 🙂