2017-11-02 14 views
0

これらのプロジェクトをビルドする必要があり、いくつかの奇妙な方法があります。それらは、別のプロジェクトのビルドプロセスの結果として生成されたリンクされたコードファイルに依存しています。これらのプロジェクトは、サブフォルダ内にあります。.NET 4.7の外部プロジェクトを解決するMSBuildターゲット経由のNuGet依存関係

したがって、私たちのプロジェクトをビルドする前に、サブプロジェクトを構築する必要があります。これは、カスタムビルドターゲットを各プロジェクトのBeforeBuildターゲットに追加することで実行され、動作するようです。ただし、サブプロジェクトは、NuGetの依存関係を復元することなくビルドされません。

明確にする:このパターンは完全に嫌気ですが、このパターンを使用するすべてのプロジェクトをリファクタリングする人材はありません。私たちは、それらを一段階で確実にコンパイルできるようにしようとしています。

これらの外部プロジェクトの依存関係のそれぞれは、カスタムItemGroupにリストされているので、同じよう:

<ItemGroup> <ExternalDependantProjects Include= "..\<subfolder>\<project>\<project>.csproj" /> </ItemGroup>

私たちは、各プロジェクトのBeforeBuildターゲットによって呼び出されるカスタムビルドターゲットを追加することによってこの問題を解決しようとしてきました。最初にResolveNuGetPackageAssetsをビルドターゲットとして使用しようとしましたが、net47をターゲットにしている間にこれがnetcoreでのみサポートされていることがわかりました。

今、外部プロジェクトのNuGet依存関係を復元するカスタムビルドターゲットを作成しようとしています。 <Exec Command="nuget restore @(ExternalDependantProjects)" />と多少複雑&ハックPowerShellの試み:<Exec Command="powershell.exe -command &quot;&apos;@(ExternalDependantProjects, '&apos; &apos;')&apos; | foreach { nuget restore $_ }&quot;" />

は、どちらの場合も、それは単にメインプロジェクトのパッケージではなく、外部のプロジェクトを復元しようとする私たちはそうのように、ストレートなアプローチを試みました。 @(ExternalDependantProjects)が空白に等しいと思われるので、新しい引数は追加されません。 usingを使用すると、@(ExternalDependantProjects)は何も返しません。ただし、MSBuildの「ビルド」ターゲットを呼び出すときは、「プロジェクト」パラメータとして機能します。だから私は間違った方法でItemパラメーターを使用していると思われますか?おそらく、アイテムのIncludeプロパティにアクセスするための構文がありますか?

しかし、私たちがその問題を解決できるのであれば、それがうまくいくかどうかはわかりません。サブプロジェクトでnuget restoreコマンドを使用してテストした結果、package.confのすべてのパッケージがインストールされているという応答が常に得られます。しかし、その外部プロジェクトの\ packages \は空で、packages.confには半ダースのパッケージが指定されています(これらはVSの "References"からも見つからず、参照のHintPathは.. \ packagesに正しく移動します)。

私たちは3つの面で混乱しています:MSBuildターゲットからのExternalDependentProjects Itemインクルードパスの参照方法、なぜNuGetリストアCLIが機能しないのか、この問題を解決する正しい方法?私たちは間違った道を完全に崩したのですか?

+0

これがハッキングされる必要がある理由は明らかにされていません。ちょうど他のような通常のプロジェクトにしてください。あなたがしなければならないことは、他のものの前に構築されていることを確認することだけです。おそらくMSBuildはこれを理解することはできませんので、手伝ってください。ソリューションノードを右クリックし、[プロジェクトの依存関係]を選択します。 –

+1

@ジャンスキー、この問題はどうですか?この問題は解決しましたか?そうでない場合は、この問題に関する最新情報をお知らせください。 –

+0

ちょっと@レオ-MSFT、私は本当にあなたの応答に入れてすべての努力に感謝します。それは私に解決策に向かって良いカップルのスレッドを与えた。しかし、私は別のプロジェクトに移ってきましたが、これを解決するための時間をいつ得るかはわかりません。いずれにせよ、私はあなたの答えを今のところ答えにします。 – Jansky

答えて

3

どのように我々はExternalDependentProjects項目を参照してください理由NuGetは、CLIの仕事を復元しません、MSBuildの対象からパスを含め、これがこの問題の解決について移動するにも正しい方法は何ですか?私たちは間違った道を完全に崩したのですか?

あなたはオプション-OutputDirectoryでカスタムビルドターゲットを記述する必要がありますので、カスタムビルドターゲットは以下のようにする必要があります:

<Target Name="BeforeBuild"> 
     <Exec Command="nuget restore @(ExternalDependantProjects) -OutputDirectory ..\<subfolder>\packages" /> 
    </Target> 

このターゲットでは、外部のプロジェクトのためのNuGetパッケージが正常に復元されます。

さらに、@(ExternalDependantProjects)の値が空白と等しくない場合は、ターゲットにこの値をエコーすることができます。

以下は私のテストサンプルである、あなたは、いくつかの詳細情報を参照できます。

ExternalpProjectTestExternalProjectは、外部のプロジェクト名で、サブフォルダ名です。

<ItemGroup> 
    <ExternalDependantProjects Include= "..\ExternalpProject\TestExternalProject\TestExternalProject.csproj" /> 
</ItemGroup> 

<Target Name="BeforeBuild"> 
    <Message Text="Restore package for Externalp Project" Importance="high"></Message> 
    <Exec Command="nuget restore @(ExternalDependantProjects) -OutputDirectory ..\ExternalpProject\packages" /> 
</Target> 

<Target Name="AfterBuild"> 
    <Message Text="Display the value of ExternalDependantProjects" Importance="high"></Message> 
    <Message Text="@(ExternalDependantProjects)"></Message> 
</Target> 

enter image description here

1

NuGetはpackages.configプロジェクトがソリューションファイルから復元することを検出します。すべてのプロジェクトがソリューションファイルにあり、nuget.exe restore <solution file>を実行した場合、プロジェクトファイルに何が起きているかにかかわらず復元されます。

カスタムシナリオの回避策として、フォルダ内のすべてのpackages.configファイルを検出するスクリプトを作成してから、ファイルに直接nuget.exe restore <packages.config> -SolutionDirectory <solution root>を呼び出すことができます。 packages.configファイルを復元するには、パッケージレベルのパッケージフォルダにダウンロードして展開できるように、packages.configファイルからID /バージョンの一覧を検出する必要があります。

ReferenceOutputAssembly=falseのプロジェクトリファレンスを使用して、プロジェクトを希望通りの順序で構築し、互いに参照しないようにすることもお勧めします。参照:https://blogs.msdn.microsoft.com/kirillosenkov/2015/04/04/how-to-have-a-project-reference-without-referencing-the-actual-binary/

関連する問題