3

Ich habe foo.csproj

<Project Sdk="Microsoft.NET.Sdk"> 

    <PropertyGroup Label="Globals"> 
      <ExtPath>$(SolutionDir)\WpfNetStandardSample\CustomProjectSystem\</ExtPath> 
    </PropertyGroup> 

    <Import Project="$(ExtPath)CustomProject.props" /> 

</Project> 

aus der Lösung Datei referenziert bar.sln

wiederherzustellen meine nuget Pakete aus dem CI-Server ich betreibe

msbuild /t:restore bar.sln 

und erhalte ich die Fehler

"C: \ Benutzer \ phelan \ Arbeitsplatz \ bar \ bar.sln" (Wiederherstellungs-Ziel) (1) -> "C: \ Benutzer \ phelan \ Arbeitsplatz \ bar \ foo \ foo.csproj" (_IsProjectRestoreSupported Ziel) (11) ->
C: \ Benutzer \ phelan \ Arbeitsplatz \ bar \ foo \ foo.csproj (7,3): Fehler MSB4019: Das importierte Projekt „C: \ WpfNetStandardSample \ CustomProjectSystem \ CustomProject .props "wurde nicht gefunden. Vergewissern Sie sich, dass der Pfad in der Deklaration korrekt ist und dass die Datei auf der Festplatte vorhanden ist.

Leitfrage

Wie/warum ist SolutionDir zu c Lösung:. \ und nicht das Verzeichnis der Lösungsdatei in ist

Hinweise

  • die gesamte Lösung baut aus Visual Studio.
  • läuft msbuild foo.sln baut die gesamte Lösung (unter der Annahme nuget Pakete allready wiederhergestellt werden)
  • msbuild Version ist 15.3.409.57025
  • die Lösung eine Mischung von Projekten ist, einige mit packages.config und einige mit PackageReference. Einige der Projekte PackageReference verwenden, sind dotnetstandard Bibliotheken und einige sind net461 Bibliotheken
  • Es scheint eine Vielzahl von Anregung zu sein, wie nuget Pakete
    • Dotnet wiederherstellen
    • wiederherzustellen nuget wiederherstellen enter image description here
    • msbuild/t :
    • dotnet msbuild/t wieder her: foo.sln
wiederherstellen

Was ist der richtige Prozess für meinen gemischten Setup-Typ?

Github-Repository für den Fehler reproduzieren

https://github.com/bradphelan/msbuildbug

+0

Ich habe einen Fehler zu https://github.com/dotnet/sdk/issues/1623 – bradgonesurfing

Antwort

1

Dies geschieht, weil für die Restore Ziel der Lösung ist die SolutionDir nicht auf das erzeugte Projekt als Referenz übergeben.

Sie können dies sehen beim Laufen:

MSBuildEmitSolution=1 dotnet msbuild /t:Restore 

Für eine foo.sln dies eine foo.sln.metaproj Datei generieren, die die tatsächliche msbuild Interpretation der Lösung Format enthält, zusammen mit Erweiterungen, die hinzugefügt werden (wie 15.0/SolutionFile/ImportAfter/Microsoft.NuGet.ImportAfter.targets in unserem Fall).

Das erzeugte Build Ziel enthält folgende Komponenten:

<Target Name="Build" Outputs="@(CollectedBuildOutput)"> 
    <MSBuild Projects="@(ProjectReference)" BuildInParallel="True" Properties="BuildingSolutionFile=true; CurrentSolutionConfigurationContents=$(CurrentSolutionConfigurationContents); SolutionDir=$(SolutionDir); SolutionExt=$(SolutionExt); SolutionFileName=$(SolutionFileName); SolutionName=$(SolutionName); SolutionPath=$(SolutionPath)" SkipNonexistentProjects="%(ProjectReference.SkipNonexistentProjects)"> 
     <Output TaskParameter="TargetOutputs" ItemName="CollectedBuildOutput" /> 
    </MSBuild> 
    </Target> 

Sie können sehen, dass diese SolutionDir und andere lösungsbezogenen Eigenschaften explizit festlegt. Gleiches gilt für zahlreiche andere in die Lösung generierte Ziele.

Die NuGet-Ziele tun dies jedoch nicht (technischer Grund ist, dass sie denselben MSBuild-Code für Projekte und Lösungen verwenden). Bei der Überprüfung der <MSBuild> Elemente, die von nuget erstellt wurden, legen sie diese Eigenschaften nicht fest und sind daher während der Auswertung im Projekt nicht verfügbar.

Als Workaround empfehle ich MSBuild 15 Directory.Build.props Logik, die eine Datei mit diesem Namen automatisch in alle Projekte importiert, die die gemeinsamen Requisiten/Ziele verwenden. (fast alle Projekttypen).

In dieser Datei bei der Lösung Verzeichnis oder ein Verzeichnis über das Projekt platziert es gilt, können Sie entweder eine Variable direkt in Projekten (ExtPath) oder stellen Sie die gewünschten gemeinsame Eigenschaften zu verwenden:

<Project> 
    <PropertyGroup> 
    <ExtPath>$(MSBuildThisFileDirectory)</ExtPath> 
    <VersionPrefix>1.2.3</VersionPrefix> 
    </PropertyGroup> 
    <Import Project="$(ExtPath)Some\other.props" /> 
</Project> 
0

Dies ist eine Abhilfe keine Lösung.Verwenden Sie einen relativen Pfad

<Project Sdk="Microsoft.NET.Sdk"> 

    <PropertyGroup Label="Globals"> 
      <ExtPath>..\WpfNetStandardSample\CustomProjectSystem\</ExtPath> 
    </PropertyGroup> 

    <Import Project="$(ExtPath)CustomProject.props" /> 

</Project> 
+1

eingereicht. Ich würde vorschlagen, eine 'Directory.Build.props' Datei im sln-Verzeichnis zu erstellen, das' $ (MSBuildThisFileDirectory) 'definiert Sie müssen das also nicht in jedem Projekt einstellen. –

+0

Wird dies automatisch in jedem Kind csproj enthalten? – bradgonesurfing

+0

Ja, das ist eine Eigenschaft von Msbuild 15 (gemeinsame Requisiten/Ziele) –

Verwandte Themen