Как прочитать значение свойства из внешнего файла?
У меня есть файл AssemblyInfo.cs, который автоматически создается при сборке. Вот часть файла.csproj:
<PropertyGroup>
<Major>2</Major>
<Minor>3</Minor>
<Build>0</Build>
<Revision>0</Revision>
</PropertyGroup>
<Target Name="BeforeBuild">
<SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="C:\Program Files\VisualSVN Server\bin">
<Output TaskParameter="Revision" PropertyName="Revision" />
</SvnVersion>
<AssemblyInfo CodeLanguage="CS"
OutputFile="$(MSBuildProjectDirectory)\Properties\VersionInfo.cs"
AssemblyVersion="$(Major).$(Minor).$(Build).$(Revision)"
AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)"/>
</Target>
Но я не знаю, как указать Major
а также Minor
свойства вне файла.csproj, поэтому мне не нужно выгружать проект каждый раз, когда я хочу изменить версию. Мне нужно либо загрузить их из специального текстового файла внутри проекта, либо как-то установить их в диалоге свойств проекта. Какие-либо предложения?
4 ответа
Используемый ReadLinesFromFile
сделать версию в отдельном файле:
<ReadLinesFromFile File="Properties\Version.txt">
<Output TaskParameter="Lines" ItemName="Ver" />
</ReadLinesFromFile>
<SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="C:\Program Files (x86)\VisualSVN Server\bin">
<Output TaskParameter="Revision" PropertyName="Revision" />
</SvnVersion>
<Message Text="Version: @(Ver).$(Revision)" />
<AssemblyInfo
CodeLanguage="CS"
OutputFile="$(MSBuildProjectDirectory)\Properties\VersionInfo.cs"
AssemblyVersion="@(Ver).$(Revision)"
AssemblyFileVersion="@(Ver).$(Revision)"/>
Это можно сделать, используя способность PropertyFunctions напрямую вызывать определенные функции.NET. По сути, вы можете вызвать File.ReadAllText() при установке значения свойства.
<PropertyGroup>
<Version>$([System.IO.File]::ReadAllText("Version.txt"))</Version>
</PropertyGroup>
<SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="C:\Program Files (x86)\VisualSVN Server\bin">
<Output TaskParameter="Revision" PropertyName="Revision" />
</SvnVersion>
<Message Text="Version: $(Version).$(Revision)" />
<AssemblyInfo
CodeLanguage="CS"
OutputFile="$(MSBuildProjectDirectory)\Properties\VersionInfo.cs"
AssemblyVersion="$(Version).$(Revision)"
AssemblyFileVersion="$(Version).$(Revision)"/>
Файл Version.txt будет содержать только первые три номера версии, то есть "1.2.3" или что-то еще.
Я не уверен, когда именно это было добавлено в MSBuild, но, вероятно, это было после того, как этот вопрос был задан и дан ответ.
Вы можете использовать свои внешние инструменты
<Exec Command="newversion incMinor AssemblyInfo.cs > newversion.log" />
Если вас беспокоит блокировка файлов csproj с помощью VS, мой ответ на этот вопрос - как отключить кэширование определений сборки в Visual studio, может помочь вам.
Вы можете переместить содержимое вашей задачи BeforeBuild (включая группу свойств version) в отдельный файл proj и вызвать его с помощью задачи MSBuild (используя случайное имя файла, сгенерированное в примере в связанном ответе выше). Это позволит вам вручную редактировать свойства номера версии без необходимости выгружать / загружать файл csproj.
Используйте страницы свойств, чтобы вы могли установить эти свойства в диалоговых окнах листов свойств проекта.
Вам нужно будет создать файл свойств и отредактировать файл проекта (только один раз), чтобы добавить директиву импорта в файл свойств. Вот пример.