2012-04-03 5 views
1

私はstealを使ってコンパイルしているWebアプリケーションを持っています。そして、プロダクション用に必要なファイルをコピーしたいだけですが、ディレクトリ構造を保持する必要があります。したがって、たとえば、ディレクトリは(production.js/CSSファイルにJS/CSSをコンパイルする)構築のを盗む実行した後、次のようになります。msbuildでコピーするファイルをチェリーピックしてディレクトリ構造を保持するにはどうしたらいいですか?

このうち
\WebApp\index.html 
\WebApp\app\img\a.png 
\WebApp\app\img\b.png 
\WebApp\app\js\foo.js 
\WebApp\app\js\bar.js 
\WebApp\app\css\base.css 
\WebApp\app\css\app.css 
\WebApp\app\css\widget1.css 
\WebApp\app\production.js 
\WebApp\app\production.css 
\WebApp\steal\steal.js 
\WebApp\steal\README.md 
\WebApp\steal\build\build.js 

、私はに少数の特定のファイルをコピーします同じディレクトリ構造は:

<PropertyGroup> 
    <WorkingDir>WebApp\</WorkingDir> 
    <OutputDir>artifacts\staging\www\</OutputDir> 
</PropertyGroup> 

... 

<ItemGroup> 
    <CopyFiles Remove="@(CopyFiles)" /> <!-- clean existing items --> 
    <CopyFiles Condition="'$(Configuration)'=='Debug'" 
     Include="$(WorkingDir)\**\*.*" 
     Exclude="$(WorkingDir)\**\.svn\**" /> 
    <CopyFiles Condition="'$(Configuration)'=='Release'" 
     Include="$(WorkingDir)\index.html;$(WorkingDir)\app\img\**\*.*;$(WorkingDir)\app\production.*;$(WorkingDir)\steal\steal.js;" 
     Exclude="$(WorkingDir)\**\.svn\**" /> 
</ItemGroup> 

<Copy SourceFiles="@(CopyFiles)" 
    DestinationFolder="@(CopyFiles->'$(OutputDir)\%(RecursiveDir)%(Filename)%(Extension)')" /> 

問題0:

\artifacts\staging\www\index.html 
\artifacts\staging\www\app\img\a.png 
\artifacts\staging\www\app\img\b.png 
\artifacts\staging\www\app\production.js 
\artifacts\staging\www\app\production.css 
\artifacts\staging\www\steal\steal.js 

は、理想的には私はこのような何かを持っていると思いますfもちろん、ディレクトリ構造は保存されていません。実際には、すべてのファイルをサブディレクトリのない$(OutputDir)に入れます。 %(RecursiveDir)**の拡張ですが、ほとんどのパスを明示的に指定しているので、実際には有効になりません。


今、私は私がcopyタスクとitemgroup Sの束でこれをブルートフォースすることができます知っているが、それはさておき醜いされてから、独自の問題を紹介します。 1つは、誰かがアイテムを追加したい場合、ユニークなアイテムグループ名(このビルドスクリプトは大きく、多くの他のタスクを実行する)を使用する必要があり、いくつかの行がすべて同期していることを確認する必要があるからです。

これよりも良い方法がありますか?

<ItemGroup> 
    <IndexFiles Include="$(WorkingDir)\index.html" /> 
    <ImgFiles Include="$(WorkingDir)\app\img\**\*.*" /> 
    <AppFiles Include="$(WorkingDir)\app\production.*" /> 
    ... 
</ItemGroup> 

<Copy SourceFiles="@(IndexFiles)" 
    DestinationFolder="@(IndexFiles->'$(OutputDir)\%(RecursiveDir)%(Filename)%(Extension)')" /> 
<Copy SourceFiles="@(ImgFiles)" 
    DestinationFolder="@(ImgFiles->'$(OutputDir)\app\img\%(RecursiveDir)%(Filename)%(Extension)')" /> 
<Copy SourceFiles="@(AppFiles)" 
    DestinationFolder="@(AppFiles->'$(OutputDir)\app\%(RecursiveDir)%(Filename)%(Extension)')" /> 
.... 

答えて

2

私は同じ問題を抱えていましたが、いくつかの苦労した後、私はそれをやりました。キーは、 "**"の後に含めるフォルダを指定することです。その結果、

<ItemGroup> 
    <CopyFiles Include="$(WorkingDir)\index.html" /> 
    <CopyFiles Include="$(WorkingDir)\**\app\img\**\*.*" /> 
    <CopyFiles Include="$(WorkingDir)\**\app\production.*" /> 
    ... 
</ItemGroup> 

、出力ディレクトリは、「IMG」のすべてのサブディレクトリ、および「生産」という名前のすべてのファイルとアプリのフォルダが含まれています。

「RecursiveDir」のある部分は変更されません。

+0

正しい。"**"を以前の場所に移動すると、RecursiveDirは正しい結果に終わります。ニース警告! – granadaCoder

0

あなたのロジックは、やや逆と**を使用してすべてのものを含めると、あなたがしたくないファイルを除外することができます:

<CopyFiles Condition="'$(Configuration)'=='Debug'" 
     Include="$(WorkingDir)\**\*.*" 
     Exclude="$(WorkingDir)\**\.svn\**" /> 
    <CopyFiles Condition="'$(Configuration)'=='Release'" 
     Include="$(WorkingDir)\**\*.*" 
     Exclude="$(WorkingDir)\**\.svn\**;$(WorkingDir)\app\css\*.*;$(WorkingDir)\app\js\*.*;$(WorkingDir)\steal\README.md;$(WorkingDir)\steal\build\*.*" /> 

あなたはその後、$(RecursiveDir)プロパティを使用することができます。

1

ポットに追加するだけです。

「除外するファイル」戦略を使用することもできます。

以下はすべての* .txtファイルと* .docファイルを取得しますが、特定の名前のファイルも除外します。

質問は.....特定のファイルを含めることに興味がありますか...特定のファイルを除外することに興味がありますか?

随時「トリック」が必要です。

<ItemGroup> 
    <MyExcludeFiles Include="$(WorkingDir)\**\SuperSecretStuff.txt" /> 
    <MyExcludeFiles Include="$(WorkingDir)\**\SuperSecretStuff.doc" /> 
</ItemGroup> 

<ItemGroup> 
    <MyIncludeFiles Include="$(WorkingDir)\**\*.txt" Exclude="@(MyExcludeFiles)"/> 
    <MyIncludeFiles Include="$(WorkingDir)\**\*.doc" Exclude="@(MyExcludeFiles)"/> 
</ItemGroup>   


<Copy 
SourceFiles="@(MyIncludeFiles)" 
DestinationFiles="@(MyIncludeFiles->'$(OutputDir)\%(RecursiveDir)%(Filename)%(Extension)')" 
/> 
+0

私は、セミコロンで区切られたリストよりも、 "行単位"の定義を優先します。 – granadaCoder

関連する問題