Я хочу запустить скрипт во время сборки C #, но ** только **, когда проект не обновлен - PullRequest
3 голосов
/ 31 августа 2010

Я пытаюсь настроить правильный способ автоматического управления версиями для моих проектов C # в .Net.

Требования:

  1. сборка только для сборкикогда не актуально.(нормальное поведение в Visual Studio и через MSBuild)
  2. Когда сборка собрана, ей назначают правильную версию.

Я нашел решение, чтобы дать мне версию-Строки, которые я хочу.Однако, чтобы сборки отражали эту версию после сборки, мне нужно изменить файл assemblyInfo.cs непосредственно перед его сборкой.В итоге я включил эту функцию, добавив скрипт, который будет запускаться на событии перед сборкой.В соответствии с документацией Microsoft это должно быть хорошо:

Pre-build events do not run if the project is up to date and no build is triggered.

(ref: http://msdn.microsoft.com/en-us/library/42x5kfw4.aspx):

Этотак что не верно! сценарии событий предварительной сборки всегда выполняются - даже если проект обновлен! То есть сценарий предварительной сборки запускается, даже если он не перекомпилируется (так какэто актуально). Так как мой скрипт обновляет файл assemblyInfo.cs, проект больше не обновляется, поэтому он перекомпилируется (из-за ошибки / designflaw мне пришлось добавить директиву, чтобы отключить кэширование).означает, что проект перекомпилируется каждый раз, что, конечно, не то, что я хочу - учитывая, что у меня есть 103 проекта в моем решении ...

Я исследовал это дальше, добавив оба BeforeBuildи цели BeforeCompile в файле проекта. Угадайте, что: они также запускают каждый раз , даже если проект обновлен. Я попытался запустить сборку как из Visual Studio, так и из MSBuild с тем жепечальные результаты.

У вас есть предложение о том, как запускать сценарии ** только *, если проект не обновлен?

Кстати: прежде чем это будет предложено: Я рассмотрел большинство решений, доступных в сети, включаяавтоматическое увеличение с помощью спецификатора "1. *" в файле assemblyInfo.cs. Это не то, что я хочу. Мои потребности в версиях несколько сложнее.

1 Ответ

2 голосов
/ 06 сентября 2010

Не похоже, чтобы у кого-то было решение по этому вопросу, но с дополнительным расследованием я, наконец, смог найти обходной путь.

После изучения файла Microsoft.CSharp.targets я обнаружил, что в CoreCompile нет «ловушек», которые вызывают цели только при запуске CoreCompile. Сам CoreCompile зависит от сравнения входов и выходов, чтобы определить, должен ли он работать или нет. Вооружившись этой информацией, я скопировал спецификации ввода и вывода из CoreCompile и вуаля:)

Моя пользовательская задача BeforeCompile теперь выглядит так:

<Target
  Name="BeforeCompile"
  Inputs="$(MSBuildAllProjects);
          @(Compile);                               
          @(_CoreCompileResourceInputs);
          $(ApplicationIcon);
          $(AssemblyOriginatorKeyFile);
          @(ReferencePath);
          @(CompiledLicenseFile);
          @(EmbeddedDocumentation); 
          $(Win32Resource);
          $(Win32Manifest);
          @(CustomAdditionalCompileInputs)"
  Outputs="@(DocFileItem);
           @(IntermediateAssembly);
           @(_DebugSymbolsIntermediatePath);                 
           $(NonExistentFile);
           @(CustomAdditionalCompileOutputs)">
  <Message Text="BeforeCompile (only when project is not up-to-date)"/>
</Target>

Это выглядит немного глупо, но это работает. Входы и выходы, вероятно, также достаточно безопасны для копирования. Не вижу никакой веской причины для Microsoft часто менять их ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...