Skip to content

08_14_00 - Packaging Configuration

Sistema de configuración de empaquetado para AudioLab plugins.

Componentes

AssetInclusionRules

Gestión de reglas de inclusión/exclusión de assets con soporte de wildcards.

Características: - Patrones glob: *.wav, presets/**/*.json, bin/** - Filtrado por plataforma (Windows/macOS/Linux) - Filtrado por quality tier (Draft/Pro/Ultra) - Priorización de reglas (higher priority = procesado primero) - Inclusión/exclusión flexible

Ejemplo:

AssetInclusionRules rules;

// Incluir todos los presets
rules.addRule({"presets/**/*.json", true});

// Excluir archivos temporales (alta prioridad)
rules.addRule({"temp/**", false, Platform::All, QualityTier::All, 10});

// Solo para Windows
rules.addRule({"*.dll", true, Platform::Windows});

// Solo para Ultra tier
rules.addRule({"samples/**/*.wav", true, Platform::All, QualityTier::Ultra});

// Seleccionar assets
auto assets = rules.selectAssets("/path/to/project", Platform::Windows, QualityTier::Pro);

PlatformSpecificAssets

Gestión de assets específicos por plataforma.

Características: - Bundles por plataforma con required/optional assets - Extensiones de archivo platform-aware (.dll/.dylib/.so) - Transformación de paths entre plataformas - Validación de assets existentes - Estimación de tamaños

Ejemplo:

PlatformSpecificAssets assets;

// Windows bundle
PlatformBundle winBundle(Platform::Windows);
winBundle.requiredAssets = {"plugin.dll", "config.json"};
winBundle.optionalAssets = {"manual.pdf"};
winBundle.estimatedSize = 2 * 1024 * 1024; // 2MB

assets.addPlatformAssets(Platform::Windows, winBundle);

// Validar que existan
auto result = assets.validateAssets(Platform::Windows, "/build/output");
if (!result.valid) {
    for (const auto& missing : result.missingAssets) {
        std::cout << "Missing: " << missing << "\n";
    }
}

// Transformar path cross-platform
std::string macPath = assets.transformPath("bin/plugin.dll",
    Platform::Windows, Platform::MacOS);
// Result: "bin/plugin.dylib"

InstallerConfiguration

Configuración de instaladores por plataforma.

Características: - Soporte NSIS/WiX (Windows), PKG/DMG (macOS), DEB/RPM (Linux) - Paths de instalación por defecto - Metadata del producto (nombre, versión, publisher, GUID) - Configuración de licencias/EULA - Generación de scripts de instalador - Validación de configuraciones

Ejemplo:

InstallerConfiguration installer;

// Configuración Windows
Configuration winConfig;
winConfig.type = InstallerType::NSIS;
winConfig.metadata.productName = "TS_Compressor";
winConfig.metadata.version = "1.0.0";
winConfig.metadata.publisher = "AudioLab";
winConfig.metadata.guid = "{12345678-1234-1234-1234-123456789012}";

winConfig.paths = InstallPaths::getDefaultPaths(Platform::Windows);
winConfig.license.eulaFile = "LICENSE.txt";
winConfig.license.requireAcceptance = true;

installer.setConfiguration(Platform::Windows, winConfig);

// Validar
auto validation = installer.validate(Platform::Windows);
if (!validation.valid) {
    for (const auto& error : validation.errors) {
        std::cerr << "Error: " << error << "\n";
    }
}

// Generar script NSIS
auto script = installer.generateInstallerScript(Platform::Windows);
std::ofstream out(script.filename);
out << script.content;

JSON Schema

El archivo schemas/packaging_config.json define la estructura JSON para configuración:

{
  "product": "TS_Compressor",
  "version": "1.0.0",
  "platforms": {
    "windows": {
      "installer": "NSIS",
      "assets": [
        {"pattern": "bin/**/*.dll", "tier": "all"},
        {"pattern": "samples/**/*.wav", "tier": "ultra"}
      ]
    }
  },
  "tiers": {
    "draft": {
      "include": ["bin/**", "presets/factory/*.json"],
      "exclude": ["docs/**", "samples/**"],
      "maxSize": 10485760
    },
    "ultra": {
      "include": ["**"],
      "additionalAssets": ["samples/high_quality/**"]
    }
  }
}

Build

cd tests
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build .
./test_packaging_config.exe

Integration

# En tu CMakeLists.txt
add_subdirectory(08_14_00_packaging_config)
target_link_libraries(your_target PRIVATE packaging_config)
#include "AssetInclusionRules.hpp"
#include "PlatformSpecificAssets.hpp"
#include "InstallerConfiguration.hpp"

using namespace audiolab::plugins::packaging;

Tests

Los tests cubren: - ✅ Pattern matching con wildcards (**, *, ?) - ✅ Filtrado por platform/tier - ✅ Priorización de reglas - ✅ Conversiones string ↔ enum - ✅ Platform-specific extensions - ✅ Path transformations - ✅ Installer configuration & validation - ✅ Script generation (NSIS/PKG/DEB)

Uso Típico

Workflow completo:

// 1. Configurar reglas de inclusión
AssetInclusionRules rules;
rules.addRule({"**/*.json", true});
rules.addRule({"**/*.dll", true, Platform::Windows});
rules.addRule({"temp/**", false, Platform::All, QualityTier::All, 10});

// 2. Seleccionar assets
auto selectedAssets = rules.selectAssets(
    "/build/output",
    Platform::Windows,
    QualityTier::Pro
);

// 3. Configurar platform bundle
PlatformSpecificAssets platformAssets;
PlatformBundle bundle(Platform::Windows);
bundle.requiredAssets = selectedAssets;
platformAssets.addPlatformAssets(Platform::Windows, bundle);

// 4. Validar assets
auto validation = platformAssets.validateAssets(Platform::Windows, "/build/output");

// 5. Configurar instalador
InstallerConfiguration installer;
Configuration config;
config.type = InstallerType::NSIS;
config.metadata.productName = "MyPlugin";
config.metadata.version = "1.0.0";
config.paths = InstallPaths::getDefaultPaths(Platform::Windows);

installer.setConfiguration(Platform::Windows, config);

// 6. Generar script
auto script = installer.generateInstallerScript(Platform::Windows);

Dependencies

  • C++20
  • STL filesystem
  • Catch2 (tests only)