У меня есть проект, который выглядит примерно так:
src\ModuleA\code\somepath\test.js
src\ModuleA\code\ignorethis.txt
src\ModuleB\code\awesome.js
src\ModuleB\code\testing\file.js
И я хотел бы получить все эти файлы js из модулей, используя ItemGroup следующим образом:
<ItemGroup>
<_Scripts Include = "..\..\..\src\**\code\**\*.js"/>
</ItemGroup>
Но когда я копирую их в вывод, я хотел бы удалить пути модуля и кода. Если я использую копию, подобную этой
<Copy SourceFiles = "@(_Scripts)" DestinationFiles = "@(Scripts->'..\tmp\Test\%(RecursiveDir)%(Filename)%(Extension)')"/>
Результат выглядит так (поскольку RecursiveDir содержит весь путь, начиная с первого **)
tmp\Test\ModuleA\code\somepath\test.js
tmp\Test\ModuleB\code\awesome.js
tmp\Test\ModuleB\code\testing\file.js
Однако я пытаюсь получить такой результат:
tmp\Test\somepath\test.js
tmp\Test\awesome.js
tmp\Test\testing\file.js
Я попытался добавить метаданные с функциями, но я не могу найти правильный экран, необходимый для этой работы. Моя последняя попытка была такой (если я смогу удалить хотя бы 1 уровень папки, я предположил, что удаление второго уровня будет простым повторением еще одного мета-элемента...)
<Scripts Include = "@(_Scripts)">
<NewDir>$("%(_Scripts.RecursiveDir)".Substring(0, "%(_Scripts.RecursiveDir)".IndexOf("\")))</NewDir>
</Scripts>
Что дает Error MSB4184: The expression <cut for brevity> cannot be evaluated.
Если есть более простой метод, или кто-нибудь может сказать мне, какая правильная escape-последовательность должна заставить это работать?
После борьбы с экранированием и получением проанализированных и обработанных значений мне удалось решить эту проблему, используя следующее:
<_ScriptsFiles Include = "..\..\..\src\*\code\**\*.js"/>
<_Scripts Include = "@(_ScriptsFiles)">
<FirstSlash>$([System.String]::new('%(_ScriptsFiles.RecursiveDir)').IndexOf('\'))</FirstSlash>
<DirMinusOne>$([System.String]::new('%(_ScriptsFiles.RecursiveDir)').Substring(%(_Scripts.FirstSlash)))</DirMinusOne>
<SecondSlash>$([System.String]::new('%(_Scripts.DirMinusOne)').IndexOf('\', 1))</SecondSlash>
<DirMinusTwo>$([System.String]::new('%(_Scripts.DirMinusOne)').Substring(%(_Scripts.SecondSlash)))</DirMinusTwo>
</_Scripts>
<Copy SourceFiles = "@(_Scripts)" DestinationFiles = "@(_Scripts->'..\..\..\tmp\%(DirMinusTwo)\%(Filename)%(Extension)')"/>