Task MSBuild Lic Server
Il task Lic esegue la riga di comando lic da un progetto MSBuild, così una build può generare e firmare licenze con le stesse proprietà della riga di comando.
Il task Lic si trova in Babel.Build.dll, lo stesso assembly che fornisce il task Babel dell’offuscatore. Costruisce una riga di comando lic dalle sue proprietà e dai suoi elementi ed esegue lic.exe, quindi tutto ciò che il Riferimento della riga di comando descrive è disponibile da un file di progetto. Viene usato in due casi:
- I tuoi progetti MSBuild, per esempio per emettere una licenza di test per l’applicazione sotto test, oppure per generare le licenze dei clienti da un server di build.
- I file di progetto
.lcproj, chelic --makeprojectscrive a partire da una riga di comando elic --projectesegue di nuovo; vedi File di progetto.
Registrare il task
Referenzia l’assembly del task con un elemento UsingTask che punta a Babel.Build.dll. Nei pacchetti zip di Babel si trova nella cartella MSBuild, quindi con BabelDir impostata sulla cartella in cui è stato estratto babel_net472_<version>.zip:
<UsingTask TaskName="Lic" AssemblyFile="$(BabelDir)\MSBuild\Babel.Build.dll" />Il task esegue lic.exe dalla cartella impostata con LicDirectory. Se manca, il task cerca accanto a Babel.Build.dll e poi nella cartella indicata dalla variabile d’ambiente BABEL_INSTALL_DIRECTORY. Poiché lic.exe si trova nella radice del pacchetto zip estratto e non nella sua cartella MSBuild, imposta LicDirectory su quella radice, come fa l’esempio qui sotto.
Con LicDirectory impostata, il task esegue lic.exe, che richiede Windows. Anche i pacchetti zip babel_net80, babel_net90 e babel_net100 contengono MSBuild/Babel.Build.dll e lic.dll: quando MSBuild è eseguito dall’host dotnet e il task trova lic.dll senza LicDirectory, lo esegue tramite dotnet. Dove è disponibile solo il Babel Licensing Tool, esegui invece lic da un task Exec; le opzioni sono le stesse.
Un esempio completo
Il progetto seguente genera, al termine della build, una licenza firmata per l’assembly compilato. Intestatario, prodotto, funzionalità, campi e restrizioni sono elementi MSBuild i cui metadati diventano le coppie key=value delle opzioni corrispondenti:
<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>Equivale alla riga di comando:
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.licensesImposta ProvideCommandLineArgs="true" e leggi l’elemento di output CommandLineArgs per vedere l’esatta riga di comando costruita dal task.
Proprietà del task
Ogni proprietà corrisponde all’opzione con lo stesso significato nel Riferimento della riga di comando. Le proprietà scalari accettano una stringa; le proprietà di tipo elemento accettano un elenco di elementi.
Input e output
| Proprietà | Opzione | Descrizione |
|---|---|---|
InputFile | primo argomento | L’assembly per cui emettere la licenza, oppure il file di licenza da aggiornare o verificare. |
Project | --project | Un file di progetto .lcproj le cui impostazioni vengono applicate per prime. |
Assemblies | --assembly | Elementi che indicano altri assembly, per file o per nome, da aggiungere alla licenza. |
OutputFile | --output | Il file di licenza di output. |
Format | --format | xml, serial, base32 o ascii; anche json o ndjson per l’output di console del task. |
Encoding | --encoding | Codifica dei caratteri del file di licenza XML. |
XmlDeclaration | --[no]xmldeclaration | Indica se scrivere la dichiarazione XML. |
GenerateKeyInfo | --[no]keyinfo | Indica se includere le informazioni sulla chiave pubblica nell’elemento della firma RSA. |
MakeProject | --makeproject | Scrive un file di progetto .lcproj con le impostazioni effettive. |
GenerateLogFile, LogFile | --logfile | Reindirizza l’output di console su un file di log, il cui nome è dato da LogFile o ricavato dal file di output. |
Chiavi e firma
| Proprietà | Opzione | Descrizione |
|---|---|---|
KeyFile | --keyfile | File di chiavi PEM, SNK o PFX. |
KeyContainer | --keyname | Nome del contenitore di chiavi. |
KeyPwd | --keypwd | Password di un file di chiavi PFX. |
KeyGen | --keygen | rsa o ecdsa: genera una nuova coppia di chiavi in KeyFile. |
KeySize | --keysize | Dimensione della chiave per KeyGen. |
Sign | --sign | Firma la licenza: rsa, ecdsa o dsig. Quando questa proprietà è vuota la licenza non è firmata. |
Verify | --verify | true per verificare la firma di InputFile invece di generare una licenza. |
Contenuto della licenza
| Proprietà | Opzione | Descrizione |
|---|---|---|
LicenseId | --id | Identificatore della licenza. |
LicenseType | --type | Testo del tipo di licenza. |
IssueDate | --issuedate | Data di emissione. |
ExpireDate | --expiredate | Data di scadenza, oppure un numero di giorni. |
Licensee | --licensee | Un solo elemento: Include è il nome; metadati Id, Name, Company, Email. |
Product | --product | Un solo elemento: Include è il nome; metadati Id, Name, Version, Copyright, Description, Url. |
Components | --component | Elementi che indicano i componenti concessi in licenza. |
Features | --feature | Elementi: Include è il percorso di un file, oppure il nome della funzionalità con i metadati Id, Name, Description, Key, Data, ExpireDate, SupportExpireDate. |
Fields | --field | Elementi: Include è il percorso di un file, oppure il nome del campo con i metadati Id, Name, Value. |
Restrictions | opzioni delle restrizioni | Elementi il cui Include seleziona il tipo di restrizione; vedi Elementi di restrizione. |
Update | --update | Aggiorna in InputFile la licenza con l’identificatore indicato, oppure all. |
Elementi di restrizione
Il valore Include di un elemento Restriction seleziona l’opzione, senza distinzione tra maiuscole e minuscole, e i metadati ne forniscono le coppie key=value. Qualsiasi altro valore di Include è trattato come il nome di una restrizione personalizzata e passato a --restriction, con ogni metadato come coppia; i tipi personalizzati richiedono un assembly di estensione elencato in Register.
| Include | Opzione | Metadati |
|---|---|---|
Trial | --trial | TrialDays (o ExpireDays), RunCount, RunInstances (o AllowedInstances), RunTime (o UsageTime), Terms. |
Hardware | --hardware | HardwareKey (o Key), Data. |
Domain | --domain | Name, Role. |
Usage | --usage | Type, CanRunOnVirtualMachine (o CanRunInVirtualEnvironment), ProcessList. |
Beta | --beta | BuildType, RecentChanges, Description. |
Identificazione dell’hardware
| Proprietà | Opzione | Descrizione |
|---|---|---|
HardwareId | --hardwareid | Elementi che indicano i componenti da cui ricavare la chiave hardware. |
Salt | --salt | Salt per la chiave hardware. |
ShowHardwareInfo | --showhardwareinfo | Stampa le informazioni hardware del computer di build. |
Strumento e diagnostica
| Proprietà | Opzione | Descrizione |
|---|---|---|
License | --license | Elementi con i percorsi del file di licenza dello strumento stesso o delle cartelle in cui cercarlo. |
LicDirectory | Cartella che contiene il lic.exe da eseguire, per esempio la radice del pacchetto zip di Babel estratto. | |
Register | --register | Elementi che indicano gli assembly di estensione da caricare. |
ShowLogo | --[no]logo | Indica se stampare il banner. |
VerboseLevel | --verbose | Livello di dettaglio della console. |
NoConfiguration | --noconfig | Ignora la configurazione predefinita dello strumento. |
ProvideCommandLineArgs | true per esporre la riga di comando generata nell’elemento di output CommandLineArgs. |
File di progetto
Un file .lcproj è un normale progetto MSBuild che registra il task Lic e lo chiama da un target MakeLicense, con le impostazioni di una generazione di licenza. lic --makeproject ne scrive uno a partire dalle opzioni della riga di comando corrente, accanto al file di output se non indichi un nome, e genera comunque la licenza. lic --project legge un file di questo tipo e lo esegue, applicando sopra le eventuali altre opzioni, senza richiamare MSBuild; il file può anche essere compilato con msbuild o dotnet build su un computer in cui il task è registrato.
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.licensesIl file di progetto conserva una traccia riproducibile di come è stata prodotta una licenza, e riduce una generazione specifica per un cliente a un unico file che puoi mettere sotto controllo di versione, rivedere ed eseguire di nuovo.