Tarea Lic de MSBuild Server
La tarea Lic ejecuta la línea de comandos lic desde un proyecto de MSBuild, de modo que una compilación puede generar y firmar licencias con las mismas propiedades que la línea de comandos.
La tarea Lic se encuentra en Babel.Build.dll, el mismo ensamblado que proporciona la tarea Babel del ofuscador. Construye una línea de comandos de lic a partir de sus propiedades y elementos y ejecuta lic.exe, de modo que todo lo que describe la Referencia está disponible desde un archivo de proyecto. Se usa en dos casos:
- En sus propios proyectos de MSBuild, por ejemplo para emitir una licencia de prueba para la aplicación que se está probando, o para generar licencias de clientes desde un servidor de compilación.
- En los archivos de proyecto
.lcproj, quelic --makeprojectescribe a partir de una línea de comandos ylic --projectvuelve a ejecutar; consulte Archivos de proyecto.
Registrar la tarea
Haga referencia al ensamblado de la tarea con un elemento UsingTask que apunte a Babel.Build.dll. En los paquetes zip de Babel está en la carpeta MSBuild, así que, con BabelDir establecida en la carpeta en la que se extrajo babel_net472_<version>.zip:
<UsingTask TaskName="Lic" AssemblyFile="$(BabelDir)\MSBuild\Babel.Build.dll" />La tarea ejecuta lic.exe desde la carpeta indicada en LicDirectory. Si no se establece, la tarea busca junto a Babel.Build.dll y después en la carpeta que indica la variable de entorno BABEL_INSTALL_DIRECTORY. Como lic.exe está en la raíz del paquete zip extraído, y no en su carpeta MSBuild, establezca LicDirectory en esa raíz, como hace el ejemplo de más abajo.
Con LicDirectory establecida, la tarea ejecuta lic.exe, que requiere Windows. Los paquetes zip babel_net80, babel_net90 y babel_net100 también contienen MSBuild/Babel.Build.dll y lic.dll: cuando MSBuild se ejecuta en el host dotnet y la tarea encuentra lic.dll sin LicDirectory, lo ejecuta a través de dotnet. Allí donde solo esté disponible la Herramienta Babel Licensing, ejecute en su lugar lic desde una tarea Exec; las opciones son las mismas.
Un ejemplo completo
El proyecto siguiente genera, después de la compilación, una licencia firmada para el ensamblado compilado. El titular de la licencia, el producto, las funciones, los campos y las restricciones son elementos de MSBuild cuyos metadatos se convierten en los pares key=value de las opciones correspondientes:
<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>Esto equivale a la línea de comandos:
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.licensesEstablezca ProvideCommandLineArgs="true" y lea el elemento de salida CommandLineArgs para ver la línea de comandos exacta que construyó la tarea.
Propiedades de la tarea
Cada propiedad corresponde a la opción del mismo significado en la Referencia. Las propiedades escalares reciben una cadena; las propiedades de elementos reciben una lista de elementos.
Entrada y salida
| Propiedad | Opción | Descripción |
|---|---|---|
InputFile | primer argumento | El ensamblado que se va a licenciar, o el archivo de licencia que se va a actualizar o verificar. |
Project | --project | Un archivo de proyecto .lcproj cuyos ajustes se aplican primero. |
Assemblies | --assembly | Elementos que indican otros ensamblados, por archivo o por nombre, que se añaden a la licencia. |
OutputFile | --output | El archivo de licencia de salida. |
Format | --format | xml, serial, base32 o ascii; también json o ndjson para la salida de consola de la tarea. |
Encoding | --encoding | Codificación de caracteres del archivo de licencia XML. |
XmlDeclaration | --[no]xmldeclaration | Si se escribe la declaración XML. |
GenerateKeyInfo | --[no]keyinfo | Si se incluye la información de la clave pública en el elemento de la firma RSA. |
MakeProject | --makeproject | Escribe un archivo de proyecto .lcproj con los ajustes efectivos. |
GenerateLogFile, LogFile | --logfile | Redirige la salida de consola a un archivo de registro, cuyo nombre se toma de LogFile o del archivo de salida. |
Claves y firma
| Propiedad | Opción | Descripción |
|---|---|---|
KeyFile | --keyfile | Archivo de claves PEM, SNK o PFX. |
KeyContainer | --keyname | Nombre del contenedor de claves. |
KeyPwd | --keypwd | Contraseña de un archivo de claves PFX. |
KeyGen | --keygen | rsa o ecdsa: genera un par de claves nuevo en KeyFile. |
KeySize | --keysize | Tamaño de la clave para KeyGen. |
Sign | --sign | Firma la licencia: rsa, ecdsa o dsig. La licencia queda sin firmar cuando esta propiedad está vacía. |
Verify | --verify | true para verificar la firma de InputFile en lugar de generar una licencia. |
Contenido de la licencia
| Propiedad | Opción | Descripción |
|---|---|---|
LicenseId | --id | Identificador de la licencia. |
LicenseType | --type | Texto del tipo de licencia. |
IssueDate | --issuedate | Fecha de emisión. |
ExpireDate | --expiredate | Fecha de caducidad, o un número de días. |
Licensee | --licensee | Un elemento: Include es el nombre; metadatos Id, Name, Company, Email. |
Product | --product | Un elemento: Include es el nombre; metadatos Id, Name, Version, Copyright, Description, Url. |
Components | --component | Elementos que indican los componentes con licencia. |
Features | --feature | Elementos: Include es una ruta de archivo, o el nombre de la función con los metadatos Id, Name, Description, Key, Data, ExpireDate, SupportExpireDate. |
Fields | --field | Elementos: Include es una ruta de archivo, o el nombre del campo con los metadatos Id, Name, Value. |
Restrictions | opciones de restricción | Elementos cuyo Include selecciona el tipo de restricción; consulte Elementos de restricción. |
Update | --update | Actualiza en InputFile la licencia con el identificador indicado, o all. |
Elementos de restricción
El valor Include de un elemento Restriction selecciona la opción, sin distinguir mayúsculas de minúsculas, y los metadatos proporcionan sus pares key=value. Cualquier otro valor de Include se trata como el nombre de una restricción personalizada, que se pasa a --restriction con cada metadato como un par; los tipos personalizados necesitan un ensamblado de extensión incluido en Register.
| Include | Opción | Metadatos |
|---|---|---|
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. |
Identificación del hardware
| Propiedad | Opción | Descripción |
|---|---|---|
HardwareId | --hardwareid | Elementos que indican los componentes de los que se deriva la clave de hardware. |
Salt | --salt | Sal para la clave de hardware. |
ShowHardwareInfo | --showhardwareinfo | Muestra la información de hardware del equipo de compilación. |
Herramienta y diagnóstico
| Propiedad | Opción | Descripción |
|---|---|---|
License | --license | Elementos con las rutas del archivo de licencia de la propia herramienta o de las carpetas de búsqueda. |
LicDirectory | Carpeta que contiene el lic.exe que se va a ejecutar, como la raíz del paquete zip de Babel extraído. | |
Register | --register | Elementos que indican los ensamblados de extensión que se cargan. |
ShowLogo | --[no]logo | Si se muestra el banner. |
VerboseLevel | --verbose | Nivel de detalle de la consola. |
NoConfiguration | --noconfig | Omite la configuración predeterminada de la herramienta. |
ProvideCommandLineArgs | true para exponer la línea de comandos generada en el elemento de salida CommandLineArgs. |
Archivos de proyecto
Un archivo .lcproj es un proyecto de MSBuild corriente que registra la tarea Lic y la llama desde un destino MakeLicense, con los ajustes de la generación de una licencia. lic --makeproject escribe uno a partir de las opciones de la línea de comandos actual, junto al archivo de salida salvo que se indique un nombre, y genera igualmente la licencia. lic --project lee un archivo de este tipo y lo ejecuta, aplicando encima las demás opciones, sin invocar MSBuild; el archivo también se puede compilar con msbuild o dotnet build en un equipo donde la tarea esté registrada.
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.licensesEl archivo de proyecto conserva un registro reproducible de cómo se produjo una licencia, y hace que la generación específica de un cliente sea un único archivo que se puede versionar, revisar y volver a ejecutar.