Установить AssemblyInformationalVersion в AssemblyInfo.cs над параметрами msbuild - PullRequest
0 голосов
/ 17 марта 2020

Я ищу способ сделать следующее:

CommandLine

msbuild myProject.csproj /p:MyInfoText

И в моем C# проекте в AssemblyInfo.cs я бы do:

[assembly: AssemblyInformationalVersion($MyInfoText)]

Я пробовал цели с параметром BeforeBuild, но ничего не получалось. Кто-нибудь может и хочет помочь?

Привет

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Прежде всего, спасибо за ваши комментарии и ответы!

Я искал способ задать свой AssemblyInformationalVersion со свойством, которое я могу установить с помощью инструментов msbuild cli.

Я не могу хотите использовать любые самородки или сторонние библиотеки. Так что Community.Tasks не вариант. Очевидно, я нашел решение с помощью этого слепка для своей проблемы.

Теперь к моему окончательному решению:

Я искал, как работает Community.Task.Nugget, и создал свое собственное решение. Вы можете объявить встроенные задачи в вашем csproj, где вы можете написать C# код в нем.

 <UsingTask TaskName="MyCustomTask" TaskFactory="CodeTaskFactory" 
        AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"> //When using .NETCORE use here ...Tasks.Core.dll and change TaskFactory to RoslynTaskFacotry
       <ParameterGroup>
         <MyParam ParameterType="System.String" Required="true" />
       </ParameterGroup>
       <Task>
         <Reference Include="System.Core" />
         <Using Namespace="System" />
         <Code Type="Fragment" Language="cs">
           <![CDATA[
             // My C# Code comes here!
             // You can use your params here with Name like Console.WriteLine(MyParam)
            ]]>
         </Code>
       </Task>
     </UsingTask>

Теперь вы можете использовать его как обычную задачу в вашем .csproj

<Target Name="foo">
 <MyCustomTask MyParamter="Test" />
</Target>

Я решил свой проблема с кодированием пользовательской задачи, которая может добавить / заменить AssemblyInformationalVersion внутри AssemblyInfo.cs перед сборкой.

0 голосов
/ 18 марта 2020

Установить AssemblyInformationalVersion в AssemblyInfo.cs через msbuild Параметры

Первый , вы должны отметить, что свойства MSBuild, такие как $MyInfoText, могут использоваться только в xxxx.xxproj файла и в вашей ситуации, он может использоваться только в myProject.csproj файле, а не в файле CS.

Чтобы реализовать ваши требования , вы можете попытаться использовать цель, эквивалентную повторное развертывание параметров в файле assembly.cs в MSBuild. Основываясь на этом, вы можете переопределить его свойства из командной строки в MSBuild. Только свойства в файле XML могут быть переопределены значениями, указанными в командной строке msbuild.

Решение

1) установить пакет nuget с именем MSBuildTasks в ваш проект.

2) импортируйте MSBuild.Community.Tasks.Targets, который существует в папке lib пакета nuget. Для меня, я добавляю его в файл xxxx.csproj в верхней части файла:

<Import Project="C:\Users\Admin\source\repos\ConsoleApp\packages\MSBuildTasks.1.5.0.235\tools\MSBuild.Community.Tasks.Targets" />

3) Помимо , добавьте эти:

<PropertyGroup>
    <ProductName>$(AssemblyName)</ProductName>
    <CompanyName></CompanyName>
    <Version>1.0.0.0</Version>
    <MyInfoText>xxx</MyInfoText>
  </PropertyGroup>
  <ItemGroup>
    <AssemblyVersionFiles Include="$(MSBuildProjectDirectory)\Properties\AssemblyInfo.cs" />
  </ItemGroup>
  <Target Name="AssemblyVersion" Inputs="@(AssemblyVersionFiles)" Outputs="UpdatedAssemblyVersionFiles" BeforeTargets="Build">
    <Attrib Files="%(AssemblyVersionFiles.FullPath)" Normal="true" />
    <AssemblyInfo
      CodeLanguage="CS"
      OutputFile="%(AssemblyVersionFiles.FullPath)"
      AssemblyProduct="$(ProductName)"
      AssemblyTitle="$(ProductName)"
      AssemblyCompany="$(CompanyName)"
      AssemblyCopyright="Copyright $(CompanyName), All rights reserved."
      AssemblyVersion="$(Version)"
      AssemblyFileVersion="$(Version)"
      AssemblyInformationalVersion="$(MyInfoText)">
      <Output TaskParameter="OutputFile" ItemName="UpdatedAssemblyVersionFiles" />
    </AssemblyInfo>
  </Target>

4) После этого вы можете использовать msbuild myProject.csproj /p:MyInfoText=xxxxxx для его перезаписи.

Обновление 1

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

1) создать папку с именем newtool в вашем проекте

2) скопируйте содержимое папки tool из пакета nuget в папку newtool в вашем проекте.

enter image description here

enter image description here

3) изменить, чтобы использовать этот тег импорта в вашем xxx.csproj файле

 <Import Project="$(ProjectDir)newtool\MSBuild.Community.Tasks.Targets" />

Тогда вы сможете реализовать его и гораздо удобнее.

Надеюсь, это поможет вам.

...