2017-12-24 30 views
2

私はこれで長い時間苦労しています。msbuildは参照されたネイティブプロジェクトの出力をc#project outディレクトリにコピーしません

セットアップ:

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

この作品:

  • C#プロジェクト
  • C++プロジェクト
  • C#プロジェクトは、次の行を含むC++プロジェクトの参照を持っていますビジュアルスタジオと一緒に。 これは、コマンドラインからdevenvを使用する場合に機能します。 コマンドラインからmsbuildを使用する場合、C++プロジェクトの出力ファイルは、c#プロジェクトの出力ディレクトリにコピーされません。

    msbuildを使用して修正できませんでした。それについて多くを読んで、何も働かなかった。 diag verbosityを使用してデバッグしようとしましたが、msbuildとvisual-studioのログは非常に異なっています... ビルドマシンには有効なビジュアルスタジオがないため、devenvを使用することはできません。私が見た診断冗長でMSBuildのログで

    Target "GetCopyToOutputDirectoryItems" skipped. Previously built successfully. ビジュアルスタジオ・ログにここにある - それは違って見える - と、実際にC#の出力ディレクトリを基準とネイティブファイルをコピーするに取り組んでいます。おそらく、 ビルド順序に関連何か..

    MSBuildのログで - 私も参照してください? Target "_CopyOutOfDateSourceItemsToOutputDirectoryAlways" skipped, due to false condition; ('@(_SourceItemsToCopyToOutputDirectoryAlways)' != '') was evaluated as ('' != ''). を視覚スタジオのビルドログに私はこのターゲットが実行見ながら(それが正しいGetCopyToOutputDirectoryItemsターゲットの後に来る)

答えて

1

更新3: 以前のソリューションでは、マルチスレッドビルドを実行しているときにビルドを破るなどの望ましくない副作用が発生するようです。

現在の解決策は、動作するようですが、追加することです: <Targets>Build;BuiltProjectOutputGroup</Targets> からProjectReferenceセクション。

アップデート2:

交換:

Targets="%(_MSBuildProjectReferenceExistent.Targets)"

コメントBuild referenced projects when building from the command line.が先行のMSBuildタスクでC:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\Microsoft.Common.CurrentVersion.targets

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

、へ - トリックでした。

しかし、ビルドプロセス全体を理解していないので、私はこの解決策には自信がありません。これは単なる推測です。

アップデート1:/p:DesignTimeBuild=trueを使用して

依存関係のビルド順序に影響を与えます。働くことはできません。調査を続ける...

考えられる解決策1:私はまだそれがすべてであるかを正確にはわからない QUIRKING FOR DEV10

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

にメッセージとして送らの多くを入れた後、私は最終的に次のようになりました私は、開発者がこのクワークを取り除く予定であることを知りました(https://github.com/Microsoft/msbuild/issues/1890参照)。突然

DesignTimeBuild次の行で私の目を引い:

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

を私は視覚スタジオこの作品内部のことを知っています。グーグルはhttps://github.com/Microsoft/msbuild/wiki/MSBuild-Tips-&-Tricksに私を得た。 そこから、パスは短くて、/p:DesignTimeBuild=trueをmsbuildコマンドラインに追加しました。

これが機能しました。参照されているアセンブリがコピーされました。

私はこれが解決策ではないと思っていますが、うまくいきますし、他のものを(まだ)壊していないようです。

その他のご提案を歓迎します。

+0

'BuiltProjectOutputGroup'ターゲットのドキュメントはありますか? – yair

関連する問題