MSBuild: убедитесь, что цель запущена перед любыми другими шагами сборки - PullRequest
10 голосов
/ 09 ноября 2011

Я пытаюсь обновить файл AssemblyInfo.cs, чтобы отразить следующую версию проекта Publish ПЕРЕД любыми другими шагами сборки.

в файле моего проекта, который я добавил до конца:

<Import Project="$(ProjectDir)Properties\PublishVersion.proj" />

PublishVersion.proj выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets"/>
<Target Name="BeforeBuild">
    <FormatVersion Version="$(ApplicationVersion)" Revision="$(ApplicationRevision)">
        <Output TaskParameter="OutputVersion" PropertyName="SetVersion" />
    </FormatVersion>
    <FileUpdate Files="$(ProjectDir)Properties\AssemblyInfo.cs"
       Regex="\d+\.\d+\.\d+\.\d+"
       ReplacementText="$(SetVersion)" />
</Target>
</Project>

Теперь он выполняется где-то до завершения сборки, но определенно не до его запуска, потому что когда я смотрю на сгенерированный exe-файл, у него есть версия файла, которая была в AssemblyInfo.cs ДО начала сборки, но файл .application и файл манифеста имеют различные ссылки на новую версию.

результирующий файл манифеста (1.0.0.0 до начала сборки, 1.0.0.4 после сборки):

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly ...>
  <asmv1:assemblyIdentity name="BHTechSupport.exe" version="1.0.0.4" ... />
  ...
  <entryPoint>
    <assemblyIdentity name="BHTechSupport" version="1.0.0.0" ... />
    ...
  </entryPoint>
  ...
  <dependency>
    <dependentAssembly ... codebase="BHTechSupport.exe" ...>
      <assemblyIdentity name="BHTechSupport" version="1.0.0.0" ... />
      ...
    </dependentAssembly>
  </dependency>
  ...
</asmv1:assembly>

так, как я могу гарантировать, что моя цель будет выполнена раньше, чем ВСЕ?

внесение изменений в PublishVersion.proj иногда, кажется, не вступает в силу, и мне нужно очистить решение и перезапустить Visual Studio, прежде чем действовать.

Ответы [ 2 ]

8 голосов
/ 09 ноября 2011

Может быть, вам нужно использовать BeforeBuild target.

, так как мне убедиться, что моя цель будет выполнена перед ВСЕМ еще?

Toпроверить выполнение цели, вы можете изменить MSBuild project build output verbosity на Diagnostic.Найдите его в меню Инструменты> Параметры> Проекты и решения> Построить и запустить.Затем создайте проект и найдите свою цель в окне вывода.

внесение изменений в PublishVersion.proj иногда, кажется, не вступает в силу, и мне нужно очистить решение и перезапустить Visual Studio перед выполнением.

AFAIK, Visual Studio загружает целевые файлы один раз, поэтому вам необходимо перезагрузить проект, чтобы увидеть результат.

Обновление Я не знаю вашу систему управления версиямитогда как это не важно.Как бы то ни было, я попытался привести для вас простой пример.

using System;
using System.IO;
using Microsoft.Build.Utilities;
using Microsoft.Build.Framework;

namespace Foo.Build.Tasks {

    public sealed class GenerateVersion : Task {

        [Output]
        public ITaskItem[] GeneratedFiles { get; private set; }

        public override bool Execute() {
            string objPath = Path.Combine(Path.GetDirectoryName(this.BuildEngine3.ProjectFileOfTaskNode), "obj");
            string path = Path.Combine(objPath, "VersionInfo.cs");

            File.WriteAllText(path, @"using System.Reflection;
[assembly: AssemblyVersion(""2.0.0"")]");

            GeneratedFiles = new[] { new TaskItem(path) };

            return true;
        }

    }

}

В предыдущем задании создается файл, содержащий AssemblyVersion метаданные или все, что вы хотите.

Наконец, вам нужноизмените файл проекта следующим образом:

<UsingTask TaskName="Foo.Build.Tasks.GenerateVersion" AssemblyFile="Foo.Build.Tasks.dll" />

<Target Name="BeforeBuild">
  <GenerateVersion>
    <Output TaskParameter="GeneratedFiles" ItemName="Compile" />
  </GenerateVersion>
</Target>
1 голос
/ 15 июня 2018

Если вы хотите, чтобы цель запускалась в начале каждой сборки, независимо от того, что называется конечной целью (Очистить, Восстановить, Построить, Опубликовать), вы можете использовать атрибут InitialTargets Project элемент.

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