Каким образом вы строите проект?По командной строке 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.