148 votes

Gestion automatique des versions dans Visual Studio 2017 (.NET Core)

J'ai passé la meilleure partie de quelques heures à essayer de trouver un moyen d'auto-incrémentation des versions dans une .NETCoreApp 1.1 (Visual Studio 2017).

Je sais que le AssemblyInfo.cs est créé dynamiquement dans le dossier: obj/Debug/netcoreapp1.1/

Il n'accepte pas l'ancienne méthode: [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.*")]

Si j'ai mis le projet au forfait, je peux mettre les versions de là, mais cela semble être utilisé pour construire le AssemblyInfo.cs fichier.

Ma question est: quelqu'un a compris comment le contrôle de version .NET de Base (ou .NETStandard) des projets.

80voto

Michael Freidgeim Points 4002

Ajouter <Deterministic>False</Deterministic> à l'intérieur d'un <PropertyGroup> de la section de .csproj

La solution de contournement pour faire AssemblyVersion * travail est décrit dans "Confusion message d'erreur de joker dans [AssemblyVersion].Net De Base #22660"

Les caractères génériques sont autorisés uniquement si le build n'est pas déterministe, qui est la valeur par défaut .Net de Base des projets. L'ajout d' <Deterministic>False</Deterministic> de csproj résout les question.

Les raisons pourquoi .Net de Base aux Développeurs d'envisager Déterministe Construit bénéfiques décrits dans http://blog.paranoidcoding.com/2016/04/05/deterministic-builds-in-roslyn.html et les Compilateurs doivent être déterministe: même les entrées de générer des mêmes sorties #372

Toutefois, si vous utilisez TeamCity, TFS ou autres CI/CD outil, il est probablement préférable de garder le numéro de version contrôlée et incrémenté par eux et transmettre à construire comme un paramètre (comme il a été suggéré dans d'autres réponses) , par exemple

msbuild /t:build /p:Version=YourVersionNumber /p:AssemblyVersion=YourVersionNumber

Numéro de colis pour les packages NuGet

msbuild /t:pack /p:Version=YourVersionNumber   

68voto

joelsand Points 717

Si vous utilisez Visual Studio Team Services / TFS ou un autre processus de génération de CI pour intégrer la gestion des versions, vous pouvez utiliser l'attribut Condition msbuild, par exemple:

 <Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <Version Condition=" '$(BUILD_BUILDNUMBER)' == '' ">0.0.1-local</Version>
    <Version Condition=" '$(BUILD_BUILDNUMBER)' != '' ">$(BUILD_BUILDNUMBER)</Version>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Folder Include="wwwroot\" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.0.0" />
    <PackageReference Include="Microsoft.AspNetCore" Version="1.1.2" />
    <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="1.1.2" />
  </ItemGroup>

</Project>
 

Cela indiquera au compilateur .NET Core d'utiliser tout ce qui se trouve dans la variable d'environnement BUILD_BUILDNUMBER si elle est présente, ou de se replier sur 0.0.1-local si vous construisez une génération sur votre ordinateur local.

30voto

ravetroll Points 225

J'ai été à la recherche d'une version incrementer pour un Net de Base app dans VS2017 à l'aide de la csproj format de configuration.

J'ai trouvé un projet appelé dotnet bosse qui ont travaillé pour le projet.format json, mais du mal à trouver une solution pour la .csproj format. L'écrivain le dotnet bosse effectivement venu avec la solution pour la .csproj format et il est appelé MSBump.

Il y a un projet sur GitHub pour:

https://github.com/BalassaMarton/MSBump

où vous pouvez voir le code et de son disponible sur Nuget. Il suffit de chercher pour MSBump sur Nuget.

16voto

HolaJan Points 351

Je suis venu avec une solution qui a fonctionné presque le même que le vieux AssemblyVersion attribut avec une étoile (*) - AssemblyVersion("1.0.")*

Les valeurs pour AssemblyVersion et AssemblyFileVersion est en projet MSBuild .csproj fichier (et non pas dans AssemblyInfo.cs), des biens FileVersion (génère AssemblyFileVersionAttribute) et AssemblyVersion (génère AssemblyVersionAttribute). Dans MSBuild processus, nous utilisons notre tâche MSBuild pour générer des numéros de version et puis on remplace les valeurs de ces FileVersion et AssemblyVersion propriétés avec les nouvelles valeurs de la tâche.

Alors d'abord, nous créons notre tâche MSBuild GetCurrentBuildVersion:

public class GetCurrentBuildVersion : Task
{
    [Output]
    public string Version { get; set; }
 
    public string BaseVersion { get; set; }
 
    public override bool Execute()
    {
        var originalVersion = System.Version.Parse(this.BaseVersion ?? "1.0.0");
 
        this.Version = GetCurrentBuildVersionString(originalVersion);
 
        return true;
    }
 
    private static string GetCurrentBuildVersionString(Version baseVersion)
    {
        DateTime d = DateTime.Now;
        return new Version(baseVersion.Major, baseVersion.Minor,
            (DateTime.Today - new DateTime(2000, 1, 1)).Days,
            ((int)new TimeSpan(d.Hour, d.Minute, d.Second).TotalSeconds) / 2).ToString();
    }
}

Tâche classe hérite de Microsoft.Construire.Utilitaires.La tâche de la classe de Microsoft.Construire.Utilitaires.Base de package NuGet. Il faut BaseVersion de propriété (en option) sur l'entrée et retourne la version générée dans la Version de la sortie de la propriété. La logique pour obtenir les numéros de version est identique .NET automatique de contrôle de version (numéro de Build est jours à compter depuis le 1/1/2000 et de la Révision est la moitié de secondes depuis minuit).

Pour construire cette tâche MSBuild, nous utilisons des .NET Standard 1.3 la bibliothèque de la classe , le type de projet avec cette classe.

.csproj fichier ressemble à ceci:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard1.3</TargetFramework>
    <AssemblyName>DC.Build.Tasks</AssemblyName>
    <RootNamespace>DC.Build.Tasks</RootNamespace>
    <PackageId>DC.Build.Tasks</PackageId>
    <AssemblyTitle>DC.Build.Tasks</AssemblyTitle>
  </PropertyGroup>
 
  <ItemGroup>
    <PackageReference Include="Microsoft.Build.Framework" Version="15.1.1012" />
    <PackageReference Include="Microsoft.Build.Utilities.Core" Version="15.1.1012" />
  </ItemGroup>
</Project>

Ce projet de tâches est aussi disponible sur mon GitHub holajan/DC.Construire.Tâches

Maintenant, nous avons le programme d'installation MSBuild pour utiliser cette tâche et définir FileVersion et AssemblyVersionpropriétés. Dans .fichier csproj, il ressemble à ceci:

<Project Sdk="Microsoft.NET.Sdk">
  <UsingTask TaskName="GetCurrentBuildVersion" AssemblyFile="$(MSBuildThisFileFullPath)\..\..\DC.Build.Tasks.dll" />
 
  <PropertyGroup>
    ...
    <AssemblyVersion>1.0.0.0</AssemblyVersion>
    <FileVersion>1.0.0.0</FileVersion>
  </PropertyGroup>
 
  ...
 
  <Target Name="BeforeBuildActionsProject1" BeforeTargets="BeforeBuild">
    <GetCurrentBuildVersion BaseVersion="$(FileVersion)">
      <Output TaskParameter="Version" PropertyName="FileVersion" />
    </GetCurrentBuildVersion>
    <PropertyGroup>
      <AssemblyVersion>$(FileVersion)</AssemblyVersion>
    </PropertyGroup>
  </Target>
 
</Project>

Importtant choses ici:

  • Mentionné UsingTask importations GetCurrentBuildVersion tâche de DC.Build.Tasks.dll. Il suppose que ce fichier dll est situé sur le répertoire parent de votre .fichier csproj.
  • Notre BeforeBuildActionsProject1 Cible que les appels de la tâche doit avoir nom unique par projet dans le cas où nous avons plusieurs projets dans la solution qui appelle GetCurrentBuildVersion tâche.

L'avantage de cette solution est qu'elle ne travaille pas seulement de s'appuie sur le serveur de build, mais aussi dans le manuel de construit à partir de la dotnet construire ou Visual Studio.

11voto

Gigi Points 4810

Ces valeurs sont maintenant définies dans le fichier .csproj :

 <PropertyGroup>
    <TargetFramework>netcoreapp1.1</TargetFramework>
    <AssemblyVersion>1.0.6.0</AssemblyVersion>
    <FileVersion>1.0.6.0</FileVersion>
    <Version>1.0.1</Version>
</PropertyGroup>
 

Ce sont les mêmes valeurs que vous voyez si vous allez dans l'onglet Package dans les paramètres du projet. Bien que je ne pense pas que vous puissiez utiliser * pour auto-incrémenter la version, vous pouvez également introduire une étape de post-traitement qui remplace les versions pour vous (par exemple, dans le cadre de votre intégration continue).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X