Как мне выбрать файлы для копирования в msbuild и сохранить структуру каталогов? - PullRequest
1 голос
/ 03 апреля 2012

У меня есть веб-приложение, которое я компилирую, используя steal, и затем я просто хочу скопировать из него файлы, необходимые для производственного использования, но мне нужно сохранить структуру каталогов. Так, например, каталог выглядит так после запуска сборки steal (которая компилирует js / css в файлы production.js / css):

\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

Из этого я хочу скопировать только несколько конкретных файлов в одну и ту же структуру каталогов:

\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

В идеале у меня было бы что-то вроде этого:

<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)')" />

Проблема, конечно, в том, что структура каталогов не сохранена, и я просто помещаю все файлы в $(OutputDir) без подкаталогов. %(RecursiveDir) - это расширение **, но, поскольку я явно указал большинство путей, оно фактически не вступает в силу.


Теперь я знаю, что могу грубо форсировать это с помощью множества copy задач и itemgroup s, но это порождает свои собственные проблемы, помимо уродливости. Во-первых, он подвержен ошибкам, поскольку, если кто-то хочет добавить элемент, он должен обязательно использовать уникальное имя группы элементов (этот сценарий сборки большой и выполняет много других задач) и обеспечить синхронизацию нескольких строк.

Должен ли быть лучший способ, чем этот?

<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)')" />
....

Ответы [ 3 ]

2 голосов
/ 17 мая 2012

У меня была такая же проблема, и после некоторой борьбы мне удалось это сделать.Ключ должен указывать папки, которые вы хотите включить, после "**".

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

В результате выходной каталог будет содержать папку приложения со всеми подкаталогами "img" и всеми файлами с именами"production".

Как примечание - деталь с "RecursiveDir" остается неизменной.

1 голос
/ 21 января 2013

Просто для добавления в банк.

Вы также можете использовать стратегию «Исключить некоторые файлы».

Ниже приведены все файлы * .txt и * .doc..but также исключают файлы с определенным именем.

Вопрос в том, ..... вас больше интересует включение определенных файлов ... или ..... исключение определенных файлов.

Время от времени нужны оба «трюка».

<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 голосов
/ 03 апреля 2012

Можете ли вы немного изменить свою логику и включить все, используя **, а затем исключить ненужные файлы:

  <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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...