Установка метаданных элемента с помощью свойства

StackOverflow https://stackoverflow.com/questions/1407798

Вопрос

Я пытался сделать задачу в моих сборках TFS более общей, и одна из вещей, которую я пытаюсь сделать, - это копировать некоторые файлы в разные каталоги в зависимости от сборки, использующей задачу. Я поиграл с идеей использования свойств, но я не мог придумать, как сделать это чисто, поэтому я попытался использовать метаданные элемента, как я мог сделать это в другом месте в том же целевом файле. Я работаю, только на этот раз я хотел бы использовать свойства.

Вот что я хочу сделать:

<ItemGroup>
  <DestinationParent Include="$(DeploymentPath)">
    <DestinationParentPath>$(DeploymentPath)</QuartzParentPath>
  </DestinationParent>
</ItemGroup>

А позже в сборке я попытался скопировать некоторые файлы в папку назначения, ссылаясь на метаданные элемента:

<Copy SourceFiles="@(FilesToCopy)" DestinationFiles="@(FilesToCopy-&gt;'%(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" quot; не ссылается ни на какой фактический файл.

Итак, еще раз, почему% (DestinationParentPath) расширяется до пустой строки?

РЕДАКТИРОВАТЬ: я забыл упомянуть, что я также пытался жестко запрограммировать фактический путь для DestinationParentPath, но это все равно привело к расширению% (DestinationParentPath) до пустой строки.

Это было полезно?

Решение

  

EDIT: это определено в корневом узле Project, тогда как ItemGroup с DestinationParentPath определено в целевом узле. Это также имеет значение?

Да, это имеет значение. Возможность определения ItemGroup внутри Target является новой для msbuild 3.5. Несмотря на то, что он выглядит декларативным, он фактически выполняется во время выполнения, как если бы вы вызывали задачи в старом стиле CreateItem / CreateProperty. Это само по себе приводит к потенциальным проблемам: вам нужно учитывать, когда (в первую очередь) вызывается содержащая задача. Порядок операций не всегда очевиден для голых глаз. Возможно, целесообразно сделать задачу, в которой вы используете% (DestinationParentPath), зависимой от задачи, в которой она была создана, даже если нет " логического " зависимость.

Кроме того, существуют старые недоработки и ошибки msbuild. Динамически создаваемые свойства и amp; элементы не видны для "родного брата" Задачи . Кроме того, элементы, обновленные во вложенных сборки не всегда всплывают .

Ознакомьтесь с обходными путями в ссылках, вы сможете найти что-то подходящее для вас, даже если это неприлично.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top