Как я могу препятствовать тому, чтобы внешние файлы MSBuild кэшировались (Visual Studio) во время сборки проекта?

У меня есть проект в моем решении, которое запустило жизнь как проект библиотеки C#. Это не имеет ничего ни из какого интереса к нему с точки зрения кода, это просто используется в качестве зависимости в других проектах в моем решении, чтобы удостовериться, что это создается сначала. Один из побочных эффектов разрабатывания этого проекта - то, что общий AssemblyInfo.cs создается, который содержит номер версии, используемый другими проектами.

Я сделал это путем добавления следующего к .csproj файлу:

<ItemGroup>
  <None Include="Properties\AssemblyInfo.Shared.cs.in" />
  <Compile Include="Properties\AssemblyInfo.Shared.cs" />
  <None Include="VersionInfo.targets" />
</ItemGroup>
<Import Project="$(ProjectDir)VersionInfo.targets" />
<Target Name="BeforeBuild" DependsOnTargets="UpdateSharedAssemblyInfo" />

Файл, на который ссылаются, VersionInfo.targets, содержит следующее:

<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <!--
      Some properties defining tool locations and the name of the
      AssemblyInfo.Shared.cs.in file etc.
    -->
  </PropertyGroup>
  <Target Name="UpdateSharedAssemblyInfo">
    <!--
      Uses the Exec task to run one of the tools to generate
      AssemblyInfo.Shared.cs based on the location of AssemblyInfo.Shared.cs.in
      and some of the other properties.
    -->
  </Target>
</Project>

Содержание файла VersionInfo.targets могло просто быть встроено в .csproj файле, но это является внешним, потому что я пытаюсь превратить все это в шаблон проекта. Я хочу, чтобы пользователи шаблона смогли добавить новый проект к решению, отредактировать файл VersionInfo.targets и выполнить сборку.

Проблема состоит в том, что изменение и сохранить файл VersionInfo.targets и восстановление решения не имеют никакого эффекта - файл проекта использует значения из .targets файла, как они были, когда проект был открыт. Даже разгрузка и перезагрузка проекта не имеют никакого эффекта. Для получения новых значений я должен закрыть Visual Studio и вновь открыть ее (или перезагрузить решение).

Как я могу настроить это так, чтобы конфигурация была внешней в .csproj файл и не кэшируемая между сборками?

13
задан Damian Powell 25 May 2010 в 10:31
поделиться

1 ответ

Насколько я знаю, вы не можете. Visual Studio не использует «настоящий» MSBuild, он использует внутренний механизм сборки, который ведет себя очень похоже на MSBuild.exe, но все же имеет некоторые тонкие различия. Этот механизм сборки кэширует цели, поэтому вам придется перезапустить VS, как только вы что-то измените. Я считаю, что это даже где-то задокументировано, и нет известного обходного пути (я искал его около года назад и ничего не нашел).

Вы могли бы заставить VS перезагрузить цели через VS API - так что вам придется создать (или найти) специальное дополнение для этого.

Другой вариант - использовать что-нибудь кроме файла .targets для хранения вашей конфигурации. Например, вы можете использовать простой текстовый файл и проанализировать его с помощью MSBuild (не так элегантно, но должно работать).

Upd.

Это то, что я сделал некоторое время назад. MSBuild вызывает внешний инструмент через Exec с WorkingDirectory = "$ (SolutionDir)", инструмент "знает" все соглашения об именах файлов, расположении и т. Д., Поэтому рабочего каталога достаточно для выполнения работы. Разные данные конфигурации хранятся в конфигурации внешнего инструмента, поэтому проблем с кешированием нет.

Также посмотрите этот вопрос о чтении элементов из файла. Полагаю, это лучше соответствует вашим потребностям.

3
ответ дан 2 December 2019 в 01:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: