Tâche MSBuild lic Server
La tâche Lic exécute la ligne de commande lic depuis un projet MSBuild : un build peut ainsi générer et signer des licences avec les mêmes propriétés que la ligne de commande.
La tâche Lic se trouve dans Babel.Build.dll, l’assembly qui fournit aussi la tâche Babel de l’obfuscateur. Elle construit une ligne de commande lic à partir de ses propriétés et de ses éléments, puis exécute lic.exe, si bien que tout ce que décrit la Référence est disponible depuis un fichier de projet. Elle sert dans deux cas :
- Vos propres projets MSBuild, par exemple pour émettre une licence de test pour l’application testée, ou pour générer les licences des clients depuis un serveur de build.
- Les fichiers de projet
.lcproj, quelic --makeprojectécrit à partir d’une ligne de commande et quelic --projectexécute de nouveau ; voir Fichiers de projet.
Inscrire la tâche
Référencez l’assembly de la tâche avec un élément UsingTask qui pointe vers Babel.Build.dll. Dans les archives zip de Babel, il se trouve dans le dossier MSBuild ; ainsi, lorsque BabelDir désigne le dossier où babel_net472_<version>.zip a été extrait :
<UsingTask TaskName="Lic" AssemblyFile="$(BabelDir)\MSBuild\Babel.Build.dll" />La tâche exécute lic.exe depuis le dossier indiqué par LicDirectory. Sans cette propriété, la tâche cherche à côté de Babel.Build.dll, puis dans le dossier désigné par la variable d’environnement BABEL_INSTALL_DIRECTORY. Comme lic.exe se trouve à la racine de l’archive zip extraite, et non dans son dossier MSBuild, réglez LicDirectory sur cette racine, comme le fait l’exemple ci-dessous.
Lorsque LicDirectory est défini, la tâche exécute lic.exe, qui nécessite Windows. Les archives zip babel_net80, babel_net90 et babel_net100 contiennent elles aussi MSBuild/Babel.Build.dll et lic.dll : lorsque MSBuild s’exécute sous l’hôte dotnet et que la tâche trouve lic.dll sans LicDirectory, elle l’exécute par l’intermédiaire de dotnet. Là où seul l’Outil Babel Licensing est disponible, exécutez plutôt lic depuis une tâche Exec ; les options sont les mêmes.
Un exemple complet
Le projet ci-dessous génère, après le build, une licence signée pour l’assembly généré. Le titulaire, le produit, les fonctionnalités, les champs et les restrictions sont des éléments MSBuild dont les métadonnées deviennent les paires key=value des options correspondantes :
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask TaskName="Lic" AssemblyFile="$(BabelDir)\MSBuild\Babel.Build.dll" />
<PropertyGroup>
<BabelDir>C:\Tools\babel_net472</BabelDir>
<LicenseKeyFile>$(MSBuildProjectDirectory)\keys\signing.pem</LicenseKeyFile>
<LicenseOutputFile>$(OutDir)MyApp.licenses</LicenseOutputFile>
</PropertyGroup>
<ItemGroup>
<Licensee Include="Contoso">
<Id>C-1001</Id>
<Company>Contoso Ltd</Company>
<Email>info@contoso.com</Email>
</Licensee>
<Product Include="MyApp">
<Id>MYAPP</Id>
<Version>2.1</Version>
<Url>https://contoso.example</Url>
</Product>
<Feature Include="Pro">
<Data>1</Data>
</Feature>
<Field Include="Seats">
<Value>25</Value>
</Field>
<Restriction Include="Trial">
<TrialDays>30</TrialDays>
<RunInstances>2</RunInstances>
</Restriction>
<Restriction Include="Hardware">
<HardwareKey>GPHI6-128DI-6196C-KN5LV-BCDRE</HardwareKey>
</Restriction>
</ItemGroup>
<Target Name="MakeLicense" AfterTargets="Build">
<Lic LicDirectory="$(BabelDir)"
InputFile="$(TargetPath)"
OutputFile="$(LicenseOutputFile)"
KeyFile="$(LicenseKeyFile)"
Sign="rsa"
ExpireDate="365"
Encoding="utf-8"
Licensee="@(Licensee)"
Product="@(Product)"
Features="@(Feature)"
Fields="@(Field)"
Restrictions="@(Restriction)" />
</Target>
</Project>Ce projet équivaut à la ligne de commande suivante :
lic MyApp.dll --keyfile keys\signing.pem --sign rsa --expiredate 365 --encoding utf-8 --licensee name=Contoso --licensee id=C-1001 --licensee company="Contoso Ltd" --licensee email=info@contoso.com --product name=MyApp --product id=MYAPP --product version=2.1 --product url=https://contoso.example --feature def=... --field def=... --trial days=30 --trial instances=2 --hardware key=GPHI6-128DI-6196C-KN5LV-BCDRE --output MyApp.licensesDéfinissez ProvideCommandLineArgs="true" et lisez l’élément de sortie CommandLineArgs pour voir la ligne de commande exacte construite par la tâche.
Propriétés de la tâche
Chaque propriété correspond à l’option de même signification dans la Référence. Les propriétés scalaires reçoivent une chaîne ; les propriétés d’éléments reçoivent une liste d’éléments.
Entrée et sortie
| Propriété | Option | Description |
|---|---|---|
InputFile | premier argument | L’assembly à mettre sous licence, ou le fichier de licence à mettre à jour ou à vérifier. |
Project | --project | Un fichier de projet .lcproj dont les paramètres sont appliqués en premier. |
Assemblies | --assembly | Éléments désignant d’autres assemblies, par fichier ou par nom, à ajouter à la licence. |
OutputFile | --output | Le fichier de licence de sortie. |
Format | --format | xml, serial, base32 ou ascii ; également json ou ndjson pour la sortie console de la tâche. |
Encoding | --encoding | Encodage des caractères du fichier de licence XML. |
XmlDeclaration | --[no]xmldeclaration | Indique s’il faut écrire la déclaration XML. |
GenerateKeyInfo | --[no]keyinfo | Indique s’il faut inclure les informations de clé publique dans l’élément de signature RSA. |
MakeProject | --makeproject | Écrit un fichier de projet .lcproj avec les paramètres effectifs. |
GenerateLogFile, LogFile | --logfile | Redirige la sortie console vers un fichier journal, nommé par LogFile ou d’après le fichier de sortie. |
Clés et signature
| Propriété | Option | Description |
|---|---|---|
KeyFile | --keyfile | Fichier de clé PEM, SNK ou PFX. |
KeyContainer | --keyname | Nom du conteneur de clés. |
KeyPwd | --keypwd | Mot de passe d’un fichier de clé PFX. |
KeyGen | --keygen | rsa ou ecdsa : génère une nouvelle paire de clés dans KeyFile. |
KeySize | --keysize | Taille de clé pour KeyGen. |
Sign | --sign | Signe la licence : rsa, ecdsa ou dsig. La licence n’est pas signée lorsque cette propriété est vide. |
Verify | --verify | true pour vérifier la signature de InputFile au lieu de générer une licence. |
Contenu de la licence
| Propriété | Option | Description |
|---|---|---|
LicenseId | --id | Identifiant de licence. |
LicenseType | --type | Texte du type de licence. |
IssueDate | --issuedate | Date d’émission. |
ExpireDate | --expiredate | Date d’expiration, ou nombre de jours. |
Licensee | --licensee | Un élément : Include est le nom ; métadonnées Id, Name, Company, Email. |
Product | --product | Un élément : Include est le nom ; métadonnées Id, Name, Version, Copyright, Description, Url. |
Components | --component | Éléments désignant les composants sous licence. |
Features | --feature | Éléments : Include est un chemin de fichier, ou le nom de la fonctionnalité avec les métadonnées Id, Name, Description, Key, Data, ExpireDate, SupportExpireDate. |
Fields | --field | Éléments : Include est un chemin de fichier, ou le nom du champ avec les métadonnées Id, Name, Value. |
Restrictions | options de restriction | Éléments dont Include sélectionne le type de restriction ; voir Éléments de restriction. |
Update | --update | Met à jour, dans InputFile, la licence portant l’identifiant indiqué, ou toutes les licences avec all. |
Éléments de restriction
La valeur Include d’un élément Restriction sélectionne l’option, sans tenir compte de la casse, et les métadonnées fournissent ses paires key=value. Toute autre valeur de Include est traitée comme le nom d’une restriction personnalisée, passé à --restriction avec chaque métadonnée comme paire ; les types personnalisés nécessitent un assembly d’extension indiqué dans Register.
| Include | Option | Métadonnées |
|---|---|---|
Trial | --trial | TrialDays (ou ExpireDays), RunCount, RunInstances (ou AllowedInstances), RunTime (ou UsageTime), Terms. |
Hardware | --hardware | HardwareKey (ou Key), Data. |
Domain | --domain | Name, Role. |
Usage | --usage | Type, CanRunOnVirtualMachine (ou CanRunInVirtualEnvironment), ProcessList. |
Beta | --beta | BuildType, RecentChanges, Description. |
Identification du matériel
| Propriété | Option | Description |
|---|---|---|
HardwareId | --hardwareid | Éléments désignant les composants à partir desquels la clé matérielle est dérivée. |
Salt | --salt | Sel de la clé matérielle. |
ShowHardwareInfo | --showhardwareinfo | Affiche les informations matérielles de la machine de build. |
Outil et diagnostics
| Propriété | Option | Description |
|---|---|---|
License | --license | Éléments indiquant les chemins du fichier de licence de l’outil lui-même ou des dossiers de recherche. |
LicDirectory | Dossier contenant le lic.exe à exécuter, par exemple la racine de l’archive zip Babel extraite. | |
Register | --register | Éléments désignant les assemblies d’extension à charger. |
ShowLogo | --[no]logo | Indique s’il faut afficher la bannière. |
VerboseLevel | --verbose | Niveau de détail de la console. |
NoConfiguration | --noconfig | Ignore la configuration par défaut de l’outil. |
ProvideCommandLineArgs | true pour exposer la ligne de commande générée dans l’élément de sortie CommandLineArgs. |
Fichiers de projet
Un fichier .lcproj est un projet MSBuild ordinaire qui inscrit la tâche Lic et l’appelle depuis une cible MakeLicense, avec les paramètres d’une génération de licence. lic --makeproject en écrit un à partir des options de la ligne de commande en cours, à côté du fichier de sortie sauf si un nom est indiqué, et génère tout de même la licence. lic --project lit un tel fichier et l’exécute, en appliquant par-dessus les éventuelles options supplémentaires, sans appeler MSBuild ; le fichier peut aussi être généré avec msbuild ou dotnet build sur une machine où la tâche est inscrite.
lic MyApp.dll --keyfile keys.pem --sign --licensee name=Contoso --expiredate 365 --output MyApp.licenses --makeproject MyApp.lcproj
lic --project MyApp.lcproj --licensee name="Fabrikam" --output Fabrikam.licensesLe fichier de projet conserve une trace reproductible de la façon dont une licence a été produite, et réunit la génération propre à un client dans un seul fichier que vous pouvez versionner, relire et réexécuter.