У меня есть веб-приложение, которое я компилирую, используя 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)')" />
....