Я пытался сделать задачу в моих сборках TFS более общей, и одна из вещей, которую я пытаюсь сделать, - это копировать некоторые файлы в разные каталоги в зависимости от сборки, использующей задачу. Я поиграл с идеей использования свойств, но я не мог придумать, как сделать это чисто, поэтому я попытался использовать метаданные элемента, как я мог сделать это в другом месте в том же целевом файле. Я работаю, только на этот раз я хотел бы использовать свойства.
Вот что я хочу сделать:
<ItemGroup>
<DestinationParent Include="$(DeploymentPath)">
<DestinationParentPath>$(DeploymentPath)</QuartzParentPath>
</DestinationParent>
</ItemGroup>
А позже в сборке я попытался скопировать некоторые файлы в папку назначения, ссылаясь на метаданные элемента:
<Copy SourceFiles="@(FilesToCopy)" DestinationFiles="@(FilesToCopy->'%(DestinationParentPath)\Destination\%(RecursiveDir)%(Filename)%(Extension)')" ContinueOnError="false" ></Copy>
К сожалению, после запуска сборки мой BuildLog показывает следующее:
Copying file from "$(BinariesRoot)\%(ConfigurationToBuild.FlavorToBuild)\<File being copied>" to "\Destination\<File being copied>".
% (DestinationParentPath) расширился до пустой строки по любой причине. Использование% (DestinationParent.DestinationParentPath) вызвало ошибку, сообщающую, что я должен просто использовать% (DestinationParentPath). $ (DeploymentPath) расширяется до правильной строки, как и ожидалось в некоторых других местах сборки.
Еще одним источником путаницы является то, что использование% (ConfigurationToBuild.FlavorToBuild) дало правильное значение, т. Е. Test, как можно видеть из следующего:
EDIT: это определено в корневом узле Project, тогда как ItemGroup с DestinationParentPath определено в целевом узле. Это также имеет значение?
<ItemGroup>
<ConfigurationToBuild Include="Test|Any CPU">
<FlavorToBuild>Test</FlavorToBuild>
<PlatformToBuild>Any CPU</PlatformToBuild>
</ConfigurationToBuild>
</ItemGroup>
Не похоже, что атрибут Include является релевантным, когда вас интересует только строка в метаданных элемента, так как я уверен, что «Test | Any CPU» не ссылается ни на один фактический файл.
Итак, еще раз, почему% (DestinationParentPath) расширяется до пустой строки?
РЕДАКТИРОВАТЬ: я забыл упомянуть, что я также пытался жестко кодировать фактический путь для DestinationParentPath, но это все равно привело к расширению% (DestinationParentPath) до пустой строки.