Установка метаданных элемента с помощью свойства - PullRequest
1 голос
/ 11 сентября 2009

Я пытался сделать задачу в моих сборках 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» не ссылается ни на один фактический файл.

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

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

1 Ответ

1 голос
/ 11 сентября 2009

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

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

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

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

...