2012-04-18 13 views
8

次のファイルの出力に別のフォルダを指定することはできますか?MSBuild <Content>タグの出力パスを指定することはできますか?

<Content Include="test.stl"> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</Content> 
+0

あなたはそれを行う方法を見つけましたか? –

+0

まだ、申し訳ありません。 – abenci

+1

このリンクでは、コンテンツタグで別のフォルダを指定する方法は示されていませんが、あなたが望むことを実行できる回避策のように見えます... http://stackoverflow.com/questions/7643615/how-can- i-get-msbuild-to-copy-all-files-marked-to-a-folder-preservin –

答えて

5

「コンテンツ」ではできますが、できません。それはアイテムのタスクに依存しますが、あなたがハックする可能性があるビルトインのタスクのほとんどは、トラブルや副作用の価値があります。

これに対処するための基本的な道具があります:)これは、あなたが.Netをやっていて、Actallビルドプロセスを使用している場合、厄介なPostBuild cmdシェルを回避します。

私はこのOPの質問の中心であると思うMSBuildを使って、このような他の回答は見ませんでした。これはコアコンセプトであり、最短パスであり、副作用のない '相対パスto出力パス'パスパラメータを持つ項目タイプを見つけることはできません。

1)ポストプロセスのスタイル:

<ItemGroup> 
    ... 
    <MyTargets Include="test.stl"/> 
    ... 
</ItemGroup> 

次にあなたが後にあるものは何でもパス用いたボトム()で:

<PropertyGroup> 
    <MyDeployDir>$(SolutionDir)$(Configuration)</MyDeployDir> 
    <MyOtherDeployDir>$(SolutionDir)$(Configuration)\Templates</MyDeployDir> 
</PropertGroup> 

次に、あなたの既存 MSのビルドは、これを追加いけない(含まれて

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> 

次に、 「ビルド後に」:

<Target Name="AfterBuild"> 
    <Copy SourceFiles="@(MyTargets)" DestinationFolder="$(MyDeployDir)" SkipUnchangedFiles="true" /> 
    <Copy SourceFiles="@(MyOtherTargets)" DestinationFolder="$(MyOtherDeployDir)" SkipUnchangedFiles="true" /> 
    <Copy SourceFiles="@(MyTargets2)" DestinationFolder="$(MyDeployDir)\IHeardYourMomLikesGrapeNuts" SkipUnchangedFiles="true" /> 
</Target> 

fundemental問題は、プロジェクトの項目は、デフォルトでは何もしていけないということです、彼らは、「コンテンツ」または「MyTarget」のようなタイプがあります。何が起こるかを言うそれらのタイプ。あなたが望むものを持っているタスク、タイプ、またはビルドスクリプトのインクルードを見つけることができるかもしれませんが、ビルド中にそのファイルで何が起こるかについては、アイテムグループ内のアイテムについては何も本質的ではありません。上記は、特別に構築された「タスク」のパワーのバランスですが、すべてのトラブルはありません。

プロジェクトファイルに

<ItemGroup> 
    <MyOutFiles Include="xxx.xxx" /> 

1時間を追加すると、それはあなたが手動でprojのファイルを編集することなく、任意のファイルに設定することができます任意のファイルのためのビルドアクションのリストに表示されます。


2)ステップ1でのMSBuildのそれ以降のバージョン、あなたが「AfterBuild」ターゲット内の「ItemGroup」を埋め込み、ファイルの残りの部分に触れることなく、上記の操作を行うか、他の派手なことを行うことができますで

。これにより、単純なインクルードを使用してビルドの結果を取得し、他の場所に置き換えることができます。これは、RoboCopyを何もせずに、またはより複雑なビルドターゲット関数の処理に頼ることなく、すべてです。

<Target Name="AfterBuild"> 
    <ItemGroup> 
    <MyOutFiles Include="$(OutDir)*.*" /> 
    </ItemGroup> 
    <Copy SourceFiles="@(MyOutFiles)" DestinationFolder="$(SolutionDir)\Application" SkipUnchangedFiles="true" /> 

編集(ダウン投票のために?このメソッドはMSBuildの '関数'や 'RoboCopy'のような代替タスクを使用しませんが、以下のようなコア機能を使用してより純粋なMSBuildスタイルを表示することを意図していました。 「コンテンツ」そのもののようなアイテムタスクを作成するときに使用します。

質問は「次のファイルに別のフォルダ」を指定することができました。コンテンツタグに対してこれを行うことができます。 MSBuild関数を使用してBuildActionのすべてを再ルーティングすることはできますが、それは疑問ではありません。

これは上記の手順の1つで、これはもっと複雑で読みやすいと思っていません。以下は短い形式であり、彼が望むとにかく処理できる独自のBuildActionを作成することができます。そうではありませんが、 'コンテンツ'は、 'コンテンツ'としてマークされた特定のファイルの別のフォルダを選択するようには言いませんが、かなり簡単に行うことができます。また、StlFilesタグにメタ情報を挿入することで、タグ自体に設定できるようにアクションを指示したり、StlFilesフックをコンテンツのように早くプロセスの中に入れることができますが、それはもっと複雑です。

<StlFiles Include="test.stl" />   
... 
<Target Name="AfterBuild"> 
    <Copy SourceFiles="@(StlFiles)" DestinationFolder="$(SolutionDir)\Release\MyTypes" SkipUnchangedFiles="true" /> 
+0

答えは間違っていない、それは動作します。提供されたリンクは、RoboCopyタスクを避けるように、私が特に避けたスクリプト機能を使用する方法とは異なる方法を示しています。提供されたリンクはすべてのコンテンツを場所にキャストしますが、これは1つのファイルです。彼は1つのファイルを求めた。問題は、アイテムタスクが代替出力パスを使用できるかどうかです。答えは「はい」といいえ、「コンテンツ」は使えませんが他のタスクは可能ですが、ここでは制御できるものを作る方法があります。 – Celess

+0

最初のコメントの上にコメントがありましたが、明らかに削除されました。ちょうど言っている...上のdoesntは無作為に見える。これは私が返信していた投票結果のコメントで、なぜ編集セクションが回答に含まれていたのですか?コメントが欠落していることはかなり強く語られています。これは「この回答が間違っているだけでなく、BitwiseManが必要とするものよりもはるかに複雑なものを作ることによる投票の結果」です。 – Celess

+0

彼が参照したリンクは:http://stackoverflow.com/questions/7643615/how-can-i-get-msbuild-to-copy-all-files-marked-as-content-to-a-folder-preservin – Celess

0

は、さらに私の知る限り、出力フォルダを指定する方法はありませんが、あなたは前またはビルド後にファイルをコピーすることができます。

0

この機能はコンテンツアイテムに組み込まれていません。しかし、あなたはプロジェクトファイルにターゲットを追加することでそれをつけることができます。あなたが別の場所にコピーされた一つの特定のファイルが、最後にこれを追加することを望むと仮定すると、

<ItemGroup> 
    <Content Include="test.stl"> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
    </Content> 
</ItemGroup> 

(クロージング前に、「プロジェクト」タグ):あなたのプロジェクトで

あなたは現在、これを持って

あなたが同じフォルダにコピーするために、いくつかのより多くのファイルを追加したい場合は
<Target Name="CopyStl" AfterTargets="AfterBuild"> 
    <!-- One or the other of these Copy tasks should do what you want --> 
    <Copy Condition="'%(Identity)' == 'test.stl'" SourceFiles="@(Content)" SkipUnchangedFiles="true" DestinationFolder="$(OutputPath)\path\under\outputpath" /> 
    <Copy Condition="'%(Identity)' == 'test.stl'" SourceFiles="@(Content)" SkipUnchangedFiles="true" DestinationFolder="$(MSBuildProjectDirectory)\..\path\outside\project" /> 
</Target> 

、代わりにこれを試してみてください。

<Target Name="CopySomeFiles" AfterTargets="AfterBuild"> 
    <!-- One or the other of these Copy tasks should do what you want --> 
    <Copy Condition="'%(Identity)' == 'test.stl' AND '%(Identity)' == 'test2.stl'" SourceFiles="@(Content)" SkipUnchangedFiles="true" DestinationFolder="$(OutputPath)\path\under\outputpath" /> 
    <Copy Condition="'%(Identity)' == 'test.stl' AND '%(Identity)' == 'test2.stl'" SourceFiles="@(Content)" SkipUnchangedFiles="true" DestinationFolder="$(MSBuildProjectDirectory)\..\path\outside\project" /> 
</Target 
0
<Content Include="test.stl"> 
    <Link>some\folder\%(Filename)%(Extension)</Link> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</Content> 

includeステートメントでワイルドカードを使用する場合、これはさえからのファイルのために、また、ディレクトリ階層を維持する方法である:異なる出力フォルダはNone/Content項目にLinkメタデータを使用して指定することができますプロジェクトディレクトリ外:SDKベースのプロジェクトにおいて

<Content Include="..\shared\**\*"> 
    <Link>some\folder\%(RecursiveDir)%(Filename)%(Extension)</Link> 
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> 
</Content> 

(ASP.NETコア/ .NETコア/ .NET標準プロジェクトのデフォルト)2.0.0+ SDKを使用して、同じことがLinkBase使用して達成することができますメタデータ:

<Content Include="..\shared\**\*" LinkBase="some\folder" CopyToOutputDirectory="PreserveNewest" /> 
関連する問題