Visual studio Как установить путь вывода в зависимости от версии сборки - PullRequest
0 голосов
/ 07 июня 2019

Я хочу настроить мой основной путь вывода на что-то вроде

C:\Company\UpdaterLauncher\Worker\Version

Где версия моя AssemblyInfo.Version в строке.

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

Я знаю, что могу менять выход все время ... Но это раздражает.

Можно ли использовать что-то вроде "C:\Company\UpdaterLauncher\Worker\{AssemblyVersion}" для пути визуального вывода, чтобы интерпретировать его и построить там, где я хочу?

Я немного посмотрел в документации и ничего подобного не нашел ...

1 Ответ

1 голос
/ 10 июня 2019

Каким образом вы строите проект?По командной строке msbuild или в VS IDE?

Первое направление: давайте прочитаем номер версии сборки до начала сборки , а затем передадим его свойству outputpath.

Я написал скрипт, пытающийся прочитать версию до начала сборки.Но не полностью работает: (

Например: используя проект библиотеки классов в качестве примера.

Щелкните правой кнопкой мыши проект и выберите edit xx.csproj, добавьте скрипт (Из Inсвойство FourthNum свойство) в PropertyGroup:

  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{DAB28A16-73AD-4EC5-9F8D-E58CE3EC84BE}</ProjectGuid>
    ......
    <In>$([System.IO.File]::ReadAllText('$(MSBuildProjectDirectory)\properties\AssemblyInfo.cs'))</In>
    <Pattern>\[assembly: AssemblyVersion\(.(\d+)\.(\d+)\.(\d+).(\d+)</Pattern>
    <FirstNum>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern),System.Text.RegularExpressions.RegexOptions.Multiline).Groups[1].Value)</FirstNum>
    <SecondNum>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern),System.Text.RegularExpressions.RegexOptions.Multiline).Groups[2].Value)</SecondNum>
    <ThirdNum>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern),System.Text.RegularExpressions.RegexOptions.Multiline).Groups[3].Value)</ThirdNum>
    <FourthNum>$([System.Text.RegularExpressions.Regex]::Match($(In), $(Pattern),System.Text.RegularExpressions.RegexOptions.Multiline).Groups[4].Value)</FourthNum>
  </PropertyGroup>

Он будет считывать номер версии сборки из AssemblyInfo.cs. Если у меня есть сборка, чья версия сборки 3.13.8.5. Тогда FirstNum=3, SecondNum=13 ...

И установите выходной путь как: <OutputPath>C:\Company\UpdaterLauncher\Worker\$(FirstNum).$(SecondNum).$(ThirdNum).$(FourthNum)</OutputPath>

Перезагрузите проект и соберите его. Вы можете найти выход сборки там C:\Company\UpdaterLauncher\Worker\3.13.8.5.

Примечание:

1. Таким образом, поскольку мы создадим его как в режиме отладки, так и в режиме выпуска. Нам нужно установить значение outputpath в группе свойств для отладки и выпуска. (2 места)

2. Так как мы определяем вывод только в зависимости от версии, выходные данные и выпуск отладки будут все находиться в одной папке. Поэтому я думаю, что <OutputPath> будет лучше, например:

<OutputPath>C:\Company\UpdaterLauncher\Worker\$(FirstNum).$(SecondNum).$(ThirdNum).$(FourthNum)\$(Configuration)</OutputPath>

3.Этоскрипт не будет работать сразу после изменения версиип в VS IDE.

Через командную строку: Он работает хорошо, каждый раз, когда мы меняем номер версии и собираем его, вывод верен.

В VS IDE: Каждый раз, когда мы меняем версию, оннам нужно, чтобы выгрузить и перезагрузить файл проекта, щелкнув правой кнопкой мыши по проекту, тогда он будет работать.Так что я говорю, что это не так идеально (я думаю, что эта проблема имеет отношение к тому, когда и как VS загружает файл проекта)

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

Мы можем проверить эту проблему ,используя GetAssemblyIdentity , чтобы получить информацию после сборки.

Используя способ выше, чтобы получить номер версии, назовите его $ (MyVersion).Затем используйте цель после сборки, чтобы скопировать вывод в указанную папку.

<Target Name="CopyToSpecificFolder" AfterTargets="build">
    <GetAssemblyIdentity
        AssemblyFiles="$(OutputPath)$(AssemblyName).dll">
      <Output
          TaskParameter="Assemblies"
          ItemName="MyAssemblyIdentities"/>
    </GetAssemblyIdentity>
    <PropertyGroup>
      <MyVersion>%(MyAssemblyIdentities.Version)</MyVersion>
    </PropertyGroup>
    <ItemGroup>
      <Out Include="$(OutputPath)*.*" />
      </ItemGroup>
    <Copy DestinationFolder="C:\Company\UpdaterLauncher\Worker\$(MyVersion)" SourceFiles="@(Out)"/>
  </Target>

Добавьте этот сценарий в файл xx.csproj.Внизу это выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  ......

  <Target Name="CopyToSpecificFolder" AfterTargets="build">
    ......
  </Target>
</Project>

Хорошо работает в VS IDE или в командной строке.И для проекта класса, если вы разрабатываете проект .exe, измените $ (AssemblyName) .dll на $ (AssemblyName) .exe.

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