2017-12-24 5 views
2

Ich kämpfe seit langem mit diesem Problem.msbuild kopiert die Ausgabe des referenzierten nativen Projekts nicht nach C# project out dir

Das Setup:

  • C# Projekt
  • C++ Projekt
  • C# Projekt mit den folgenden Zeilen eine Referenz für das C++ Projekt hat:

    <ProjectReference Include="projectB.vcxproj"> 
        <ReferenceOutputAssembly>false</ReferenceOutputAssembly> 
        <OutputItemType>Content</OutputItemType> 
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
    </ProjectReference> 
    

Dies funktioniert aus dem Visual Studio. Dies funktioniert, wenn Devenv von der Befehlszeile verwendet wird. Bei der Verwendung von Msbuild von der Befehlszeile - die Ausgabedatei des C++ - Projekts wird nicht in das Ausgabeverzeichnis des C# -Projekts kopiert.

Ich konnte das mit Msbuild nicht beheben. Lesen Sie viel darüber, nichts hat funktioniert. Versuchte Debuggen mit Diag Ausführlichkeit - aber Protokolle von Msbuild und Visual-Studio sind sehr unterschiedlich ... Ich kann nicht zu Devenv verwenden, da die Build-Maschine kein gültiges Visual-Studio hat.

In msbuild Protokoll mit Diagnose Ausführlichkeit Ich sehe: Target "GetCopyToOutputDirectoryItems" skipped. Previously built successfully. Dies ist, wo in der visual-studio log - es sieht anders aus - und tatsächlich funktioniert auf das Kopieren der referenzierten native Dateien in das Verzeichnis C# Ausgabeverzeichnis. ? Vielleicht etwas mit Bauauftrag im Zusammenhang ..

In msbuild log - ich sehe auch: Target "_CopyOutOfDateSourceItemsToOutputDirectoryAlways" skipped, due to false condition; ('@(_SourceItemsToCopyToOutputDirectoryAlways)' != '') was evaluated as ('' != ''). während in Visual-Studio-Build log ich dieses Ziel zu sehen ausgeführt (es kommt direkt nach GetCopyToOutputDirectoryItems Ziel)

Antwort

1

Update 3: Es scheint, dass frühere Lösungen unerwünschte Nebenwirkungen verursachen, wie das Brechen des Builds beim Ausführen von Multithread-Builds.

Aktuelle Lösung, die zu funktionieren scheint ist hinzuzufügen: <Targets>Build;BuiltProjectOutputGroup</Targets> zur ProjectReference Seite.

Update 2:

Wechsel:

Targets="%(_MSBuildProjectReferenceExistent.Targets)"

zu

Targets="%(_MSBuildProjectReferenceExistent.Targets);GetTargetPath"

in C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets, in der Aufgabe MSBuild von dem Kommentar voran Build referenced projects when building from the command line. - hat den Trick .

Allerdings habe ich kein Vertrauen in diese Lösung, da ich den gesamten Build-Prozess nicht verstehe. Dies ist nur eine Vermutung.

Update 1:

mit /p:DesignTimeBuild=true beeinflusst Abhängigkeit alphabetischer Reihenfolge dargestellt. Kann nicht funktionieren. Untersuchung fortsetzen ...

Mögliche Lösung 1:

Nach vielen messaged in C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets setzt

Ich habe endlich auf die folgenden: QUIRKING FOR DEV10

Ich bin noch nicht ganz sicher, was das ist alles ungefähr, und ich sah, dass die Entwickler planen, diese Eigenart zu entfernen (siehe https://github.com/Microsoft/msbuild/issues/1890).

Plötzlich fing DesignTimeBuild mein Auge in der folgenden Zeile:

<Output TaskParameter="TargetOutputs" ItemName="_ResolvedProjectReferencePaths" Condition="'%(_MSBuildProjectReferenceExistent.ReferenceOutputAssembly)'=='true' or '$(DesignTimeBuild)' == 'true'"/>

Ich weiß, dass in Visual-Studio dieser Arbeit. Googeln brachte mich zu https://github.com/Microsoft/msbuild/wiki/MSBuild-Tips-&-Tricks. Von dort war der Pfad kurz, /p:DesignTimeBuild=true der Msbuild-Befehlszeile hinzuzufügen.

Das hat es funktioniert. Die referenzierte Assembly wurde kopiert.

Ich denke nicht, dass dies die Lösung sein sollte, aber es funktioniert, und scheint (noch) nichts anderes zu brechen.

Alle anderen Vorschläge wären willkommen.

+0

Gibt es eine Dokumentation des Ziels 'BuiltProjectOutputGroup'? – yair

Verwandte Themen