Cette question est très similaire à Définition du numéro de version pour les projets .NET Core , mais pas identique. Utilisant la dernière version stable de .NET Core au moment de la rédaction (1.1) et de VS2017, .NET Core est passé des fichiers de projet basés sur JSON aux fichiers CSPROJ.
Donc, ce que j'essaie de faire, c’est de configurer un environnement CI dans lequel je voudrais pouvoir modifier quelque chose avant de créer un correctif afin d’apposer le bon numéro de version à mes compilations.
Si j'utilise les attributs comme celui-ci, l'ancien (astuce SharedAssemblyInfo.cs):
[Assembly: AssemblyFileVersion("3.3.3.3")]
[Assembly: AssemblyVersion("4.4.4.4")]
quelque part dans le projet, je reçoisCS0579 - Duplicate 'System.Reflection.AssemblyFileVersionAttribute'
etCS0579 - Duplicate 'System.Reflection.AssemblyVersionAttribute'
erreurs lors de la construction.
En creusant un peu, je trouve qu’il existe un fichier ressemblant à celui-ci généré pendant le processus de construction (il n’existait pas avant la construction) dans \obj\Debug\netcoreapp1.1
:
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[Assembly: System.Reflection.AssemblyCompanyAttribute("TestApplication")]
[Assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[Assembly: System.Reflection.AssemblyDescriptionAttribute("Package Description")]
[Assembly: System.Reflection.AssemblyFileVersionAttribute("1.1.99.0")]
[Assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.1.99")]
[Assembly: System.Reflection.AssemblyProductAttribute("TestApplication")]
[Assembly: System.Reflection.AssemblyTitleAttribute("TestApplication")]
[Assembly: System.Reflection.AssemblyVersionAttribute("1.1.99.0")]
// Generated by the MSBuild WriteCodeFragment class.
Question - Comment puis-je faire ce bit?
Je vois donc que cela doit en quelque sorte être généré à partir des valeurs entrées dans la page de package des propriétés du projet, mais je ne sais pas quel serait le bon moyen de modifier ces valeurs sur ma machine CI.
Idéalement, j'aimerais pouvoir spécifier toutes ces informations dans mon script CI (Jenkins), mais je me contenterais de pouvoir définir le numéro de version.
EDIT - Plus d'infos
Après avoir lu la première réponse, je souhaitais préciser que je créais à la fois des services et des packages NuGET - et je préférerais disposer d’un moyen de gestion des versions, qui ressemblerait à l’ancien projet JSON. il suffit de mettre à jour un seul fichier.
[~ # ~] update [~ # ~] Je vais écrire avec un script une modification du fichier CSPROJ qui, à mon avis, est plutôt hacky comme section J'ai besoin de modifier les apparences comme ceci ...
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp1.1</TargetFramework>
<Version>1.0.7777.0</Version>
<AssemblyVersion>1.0.8888.0</AssemblyVersion>
<FileVersion>1.0.9999.0</FileVersion>
<Company>MyCompany</Company>
<Authors>AuthorName</Authors>
<Product>ProductName</Product>
<Description />
<Copyright>Copyright © 2017</Copyright>
</PropertyGroup>
Le problème ici est qu’il existe plusieurs éléments 'PropertyGroup'; les autres semblent étiquetés - mais ne sachant pas comment le CSPROJ est mis en place, je ne peux pas dire que ce sera toujours le cas.
Je travaille sur la prémisse que les détails du paquet seront toujours renseignés, sinon les balises value (ci-dessus) n'apparaissent pas dans le XML - je peux donc utiliser un script pour mettre à jour les valeurs en place. Si les balises de valeur n'existaient pas, je n'aurais aucune idée précise de l'élément dans lequel PropertyGroup dans lequel insérer les valeurs (ni de l'ordre, car cela semble important; le fait de modifier cet ordre m'a empêché de charger le projet dans VS2017).
Je tiens toujours à une meilleure solution que celle-ci!
Mise à jour: après que quelqu'un ait marqué cette question comme un doublon possible ( Versioning automatique dans Visual Studio 2017 (.NET Core) ) - Je n'avais pas vu cette question auparavant et la lecture semble à peu près la même chose sauf que je ne veux pas juste définir le numéro de version. En outre, les réponses à cette question ne résolvent pas mon problème - ne demande que ce que j'ai demandé dans ma question. La réponse acceptée à ma question est exactement la réponse dont j'ai besoin pour résoudre mon problème - alors que l'autre question est apparue en premier et a la même apparence - elle ne m'aide pas du tout. Peut-être qu'un mod peut aider?
Vous pouvez remplacer n'importe quelle propriété de la ligne de commande en passant /p:PropertyName=Value
Comme arguments à dotnet restore
, dotnet build
Et dotnet pack
.
Actuellement, la composition de la version fonctionne comme suit: Si Version
est non défini, utilisez VersionPrefix
(la valeur par défaut est 1.0.0 si non définie) et - si présent - append VersionSuffix
.
Toutes les autres versions sont alors définies par défaut sur ce que Version
est.
Ainsi, par exemple, vous pouvez définir <VersionPrefix>1.2.3</VersionPrefix>
Dans votre csproj, puis appeler dotnet pack --version-suffix beta1
Pour générer un YourApp.1.2.3-beta1.nupkg
(Si vous avez une référence de projet à laquelle vous souhaitez appliquer le suffixe de version eh bien, vous devez appeler dotnet restore /p:VersionSuffix=beta1
avant cela - c'est un bogue connu dans l'outillage).
Bien sûr, vous pouvez également utiliser des variables personnalisées, voir ce problème de GitHub pour quelques exemples.
Pour une référence complète des attributs d'assemblage pris en charge, je suggère de consulter le code source de la logique de construction ici (les valeurs entourées de $()
sont les propriétés utilisées). Et puisque je parle déjà de la source, this est la logique qui compose la version et quelques autres propriétés.
dotnet build /p:AssemblyVersion=1.2.3.4
Est-ce que ça marche pour toi?
Pour répondre directement à votre question: le nouveau SDK de msbuild génère automatiquement un fichier d’information sur l’assemblage. Vous pouvez supprimer cela en utilisant les directives msbuild (pour le voir par exemple: invoke dotnet migrate
sur un projet basé sur project.json).
Mais laissez-moi vous raconter ma manipulation: plusieurs projets partageant la même version. J'ai ajouté un version.props
fichier contenant un groupe de propriétés comprenant un élément nommé VersionPrefix
. J'ai inclus ce fichier via le fichier csproj (instruction Include
). J'ai aussi enlevé tous les AssemblyInfo.cs
fichiers et laissez le SDK les générer pour moi.
Je modifie le version.props
fichier pendant la construction.
J'utilise Jenkins + Octopus pour CI, et la suite a très bien fonctionné:
Powershell
pouvant prendre le numéro de build de CI comme paramètre ou, par défaut, quelque chose de prédéfini.nuspec
séparé dans le projet pour CI.nuspec
avec la dernière version de construction.Nuget
manuellement avec un fichier nuspec
à partir de # 2.nuget
vers Octopus.Dans mon cas, la clé principale était /property:Version=1.2.3.4
. Et la ligne de commande suivante a fait le travail:
dotnet build SolutionName.sln -c Release /property:Version=1.2.3.4
Ceci remplacera la version par défaut de Assembly.
MsBuild 2017 générera des informations d'assemblage si vous les manquez dans le fichier de projet.
Si vous pouvez lire le fichier cible msbuild, vous pouvez consulter:
[VS Install Dir] \MSBuild\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.GenerateAssemblyInfo.targets
Vous verrez que vous pouvez utiliser certaines propriétés dans votre fichier de projet pour désactiver les informations d'assemblage générées afin d'éviter les doublons avec vos outils générés.
<GenerateAssemblyInfo>
_ (Cette propriété active ou désactive toutes les informations relatives à l'assemblage)<GenerateAssemblyCompanyAttribute>
<GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCopyrightAttribute>
<GenerateAssemblyDescriptionAttribute>
<GenerateAssemblyFileVersionAttribute>
<GenerateAssemblyInformationalVersionAttribute>
<GenerateAssemblyProductAttribute>
<GenerateAssemblyTitleAttribute>
<GenerateAssemblyVersionAttribute>
<GenerateNeutralResourcesLanguageAttribute>
Comme j'ai déjà répondu ici , j'ai créé un outil CLI appelé dotnet-setversion que vous pouvez utiliser pour le contrôle de version de projets .NET Core de type .csproj.
Lors de la construction d'un CI, vous pouvez utiliser GitVersion ou un autre outil pour déterminer le numéro de version de votre projet, puis appeler dotnet-setversion $YOUR_VERSION_STRING
dans le répertoire racine de votre projet.
Passer/p: PropertyName = La valeur en tant qu'arguments ne fonctionne pas pour moi (ASP.Net Core 2.0 Web App). J'ai trouvé les tâches de construction du contrôle de version du manifeste sur le marché: https://marketplace.visualstudio.com/items?itemName=richardfennellBM.BM-VSTS-Versioning-Task