2017-08-08 1 views
0

Das neue msbuild csproj-Format enthält integrierte nuget-Befehle. Es ist möglich, den Standardpfad zu ändern, in dem Projekt-Assets wiederhergestellt werden, indem der Befehl <RestoreOutputPath>obj\profile7</RestoreOutputPath> in der Projektdatei verwendet wird.MSBuild nuget RestoreOutputPath Wie funktioniert es?

Aber wenn ich <RestoreOutputPath>obj\profile7</RestoreOutputPath> hinzufügen Datei daraus folgenden Csproj Befehle

dotnet restore myproj.sln 
dotnet build myproj.sln 

produzieren Fehler bauen

obj\project.assets.json' not found. Run a NuGet package restore to generate this file. 

Wie MSBuild sagen nuget Vermögenswerte aus diesem obj\Profile7 Pfad während des Build-Befehl zu bekommen?

Antwort

2

Der Wiederherstellungspfad muss mit MSBuildProjectExtensionsPath identisch sein, damit die nugget-generierten Requisiten- und Zieldateien von den gemeinsamen Requisiten und Zielen importiert werden. sowie BaseIntermediateOutputPath wird der Standard für das Erstellen des Pfads zu ProjectAssetsFile sein.

Zumindest für die NuGet Importe, ist es wichtig, dass MSBuildProjectExtensionsPath oder BaseIntermediateOutputPath gesetzt vor die SDK Requisiten Datei importiert wird.

Die einfachste Möglichkeit, alle diese Probleme zu lösen, ist BaseIntermediateOutputPath sehr früh im Projekt festzulegen, so dass alle Komponenten ihren Wert als Standardbasispfad annehmen - das ist im Wesentlichen umleiten obj zu woanders.

Dies steht im Konflikt mit der <Project SDK="..."> Syntax, da es keine Möglichkeit gibt, Eigenschaften vor der Requisite-Datei des SDK festzulegen. Um dies zu umgehen, kann das Projekt wie folgt geändert werden:

<Project> 
    <!-- This needs to be set before Sdk.props --> 
    <PropertyGroup> 
    <BaseIntermediateOutputPath>obj\SomeSubDir\</BaseIntermediateOutputPath> 
    </PropertyGroup> 

    <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" /> 

    <PropertyGroup> 
    <OutputType>Exe</OutputType> 
    <TargetFramework>netcoreapp1.1</TargetFramework> 
    </PropertyGroup> 

    <!-- other content --> 

    <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" /> 
</Project> 

Eine Alternative wäre, eine Directory.Build.props Datei zu erstellen, die automatisch importiert früh genug werden, aber dies würde den Wert für alle Projekte im Verzeichnis anwenden und wegnehmen die Fähigkeit, den Wert pro Projekt anzugeben.

+0

Sie können den BaseIntermediateOutputPath auf etwas wie '$ (MSBuildThisFileDirectory) artificates \ obj \ $ (MSBuildProjectName)' in Directory.Build.props setzen, um einen eindeutigen Pfad für jedes Projekt zu erhalten (solange Sie keine Projekte mit haben) den gleichen Namen unter verschiedenen Pfaden). –

Verwandte Themen