Bundles
Ein Setup-Prompt kopieren, der die Installationsanweisungen und die vollständige Markdown-Guideline für diesen Plugin enthält.
Bundles sind die Kernaktualisierungs-Pakete in Capgo. Jeder Bundle enthält die Web-Assets (HTML, CSS, JS), die den Inhalt Ihrer App ausmachen. Die Bundles API ermöglicht es Ihnen, diese Aktualisierungs-Pakete zu verwalten, einschließlich der Auflistung und Löschung.
Bundles verstehen
Abschnitt mit dem Titel “Bundles verstehen”Eine Bundle stellt eine bestimmte Bundle-Version (Version) Ihres Apps-Webinhalts dar und enthält:
- Bundle (Version): Semantische Versionsnummer für die Bundle
- Prüfsumme: Eindeutige Hash zum Überprüfen der Paketintegrität
- Speicher-Info: Details über den Ort und die Art der Paketierung
- Native Anforderungen: Mindestanforderungen für die native App-Version
- Metadaten: Erstellungszeit, Eigentumsrechte und andere Tracking-Informationen
Manuelle Paketierung (Ohne CLI)
Abschnitt mit dem Titel “Manuelle Paketierung (Ohne CLI)”Hier erfahren Sie, wie Sie Pakete manuell erstellen und hochladen können, ohne den Capgo CLI zu verwenden:
Schritt 1: Erstellen Sie Ihre App
Abschnitt mit dem Titel “Schritt 1: Erstellen Sie Ihre App”Zuerst bauen Sie die Web-Ressourcen Ihrer App:
npm run buildSchritt 2: Erstellen Sie einen Bundle-Zip-Datei mit denselben Paketen wie Capgo CLI
Abschnitt mit dem Titel „Schritt 2: Erstellen Sie einen Bundle-Zip-Datei mit denselben Paketen wie Capgo CLI“Wichtig: Verwenden Sie die genauen JavaScript-Pakete, die Capgo CLI intern verwendet, um die Kompatibilität sicherzustellen.
Installieren Sie die erforderlichen Pakete
Abschnitt mit dem Titel „Installieren Sie die erforderlichen Pakete“npm install adm-zip @tomasklaen/checksumErstellen Sie eine Zip-Bundle mit JavaScript (genauso wie Capgo CLI)
Abschnitt mit dem Titel “Erstelle Zip-Bundle mit JavaScript (Gleichbedeutend mit Capgo CLI)”Hinweis: In den folgenden Beispielen bezieht sich version auf den Bundle (Version)-namen, der von der API verwendet wird.
const fs = require('node:fs');const path = require('node:path');const os = require('node:os');const AdmZip = require('adm-zip');const { checksum: getChecksum } = require('@tomasklaen/checksum');
// Exact same implementation as Capgo CLIfunction zipFileUnix(filePath) { const zip = new AdmZip(); zip.addLocalFolder(filePath); return zip.toBuffer();}
async function zipFileWindows(filePath) { console.log('Zipping file windows mode'); const zip = new AdmZip();
const addToZip = (folderPath, zipPath) => { const items = fs.readdirSync(folderPath);
for (const item of items) { const itemPath = path.join(folderPath, item); const stats = fs.statSync(itemPath);
if (stats.isFile()) { const fileContent = fs.readFileSync(itemPath); zip.addFile(path.join(zipPath, item).split(path.sep).join('/'), fileContent); } else if (stats.isDirectory()) { addToZip(itemPath, path.join(zipPath, item)); } } };
addToZip(filePath, ''); return zip.toBuffer();}
// Main zipFile function (exact same logic as CLI)async function zipFile(filePath) { if (os.platform() === 'win32') { return zipFileWindows(filePath); } else { return zipFileUnix(filePath); }}
async function createBundle(inputPath, outputPath, version) { // Create zip using exact same method as Capgo CLI const zipped = await zipFile(inputPath);
// Write to file fs.writeFileSync(outputPath, zipped);
// Calculate checksum using exact same package as CLI const checksum = await getChecksum(zipped, 'sha256');
return { filename: path.basename(outputPath), version: version, size: zipped.length, checksum: checksum };}
// Usageasync function main() { try { const result = await createBundle('./dist', './my-app-1.2.3.zip', '1.2.3'); console.log('Bundle info:', JSON.stringify(result, null, 2)); } catch (error) { console.error('Error creating bundle:', error); }}
main();Schritt 3: Berechne SHA256-Prüfsumme mit demselben Paket wie CLI
Abschnitt mit dem Titel “Schritt 3: Berechne SHA256-Prüfsumme mit demselben Paket wie CLI”const fs = require('node:fs');const { checksum: getChecksum } = require('@tomasklaen/checksum');
async function calculateChecksum(filePath) { const fileBuffer = fs.readFileSync(filePath); // Use exact same package and method as Capgo CLI const checksum = await getChecksum(fileBuffer, 'sha256'); return checksum;}
// Usageasync function main() { const checksum = await calculateChecksum('./my-app-1.2.3.zip'); console.log('Checksum:', checksum);}
main();Schritt 4: Hochladen des Bundles in Ihren Speicher
Abschnitt mit dem Titel “Schritt 4: Hochladen des Bundles in Ihren Speicher”Hochladen Sie Ihr Zip-Datei in einen webzugänglichen Speicher:
# Example: Upload to your server via scpscp my-app-1.2.3.zip user@your-server.com:/var/www/bundles/
# Example: Upload to S3 using AWS CLIaws s3 cp my-app-1.2.3.zip s3://your-bucket/bundles/
# Example: Upload via curl to a custom endpointcurl -X POST https://your-storage-api.com/upload \ -H "Authorization: Bearer YOUR_TOKEN" \ -F "file=@my-app-1.2.3.zip"Wichtig: Ihre Bundle muss über einen HTTPS-URL (keine Authentifizierung erforderlich) zugänglich sein. __CAPGO_KEEP_0__’s Server müssen das Bundle von dieser URL herunterladen können. Beispiele für gültige öffentliche URLs: Schritt 5: Registrieren Sie das Bundle bei Capgo __CAPGO_KEEP_1__
Abschnitt mit dem Titel „Schritt 5: Registrieren Sie das Bundle bei __CAPGO_KEEP_0__ __CAPGO_KEEP_1__“
https://your-storage.com/bundles/my-app-1.2.3.ziphttps://github.com/username/repo/releases/download/v1.2.3/bundle.ziphttps://cdn.jsdelivr.net/gh/username/repo@v1.2.3/dist.zip
Registrieren Sie das externe Bundle bei Capgo mithilfe direkter API-Aufrufe:
Section titled “Step 5: Register Bundle with Capgo API”Register the external bundle with Capgo using direct API calls:
async function registerWithCapgo(appId, version, bundleUrl, checksum, apiKey) { const fetch = require('node-fetch');
// Create bundle (version) const response = await fetch('https://api.capgo.app/bundle/', { method: 'POST', headers: { 'Content-Type': 'application/json', 'authorization': apiKey }, body: JSON.stringify({ app_id: appId, version: version, external_url: bundleUrl, checksum: checksum }) });
if (!response.ok) { throw new Error(`Failed to create bundle: ${response.statusText}`); }
const data = await response.json(); console.log('Bundle created:', data);
return data;}API Parameters
Section titled “API Parameters”| Parameter | Beschreibung | Wird benötigt |
|---|---|---|
app_id | Deine App-Identifikation | Ja |
version | Paket (Version) semantische Version (z.B. „1.2.3“) | Ja |
external_url | Öffentlich zugänglich HTTPS-URL, an der das Paket heruntergeladen werden kann (keine Auth erforderlich) | Ja |
checksum | SHA256-Prüfsumme des Zip-Dateis | Ja |
Anforderungen an die Bundle-Struktur
Abschnitt mit dem Titel „Anforderungen an die Bundle-Struktur“Ihr Bundle-Zip muss folgende Anforderungen erfüllen:
- Root-Index-Datei: Muss haben
index.htmlIntegration von __CAPGO_KEEP_0__ - Capacitor IntegrationPfad zu den Assets
notifyAppReady()in your app code - __CAPGO_KEEP_0__ muss in Ihrer App aufgerufen werdenin Ihrer App
Gültige Bundle-Struktur
Abschnitt mit dem Titel „Gültige Bundle-Struktur“bundle.zip├── index.html├── assets/│ ├── app.js│ └── styles.css└── images/Vollständiges Manuell-Workflow-Beispiel
Abschnitt mit dem Titel „Vollständiges Manuell-Workflow-Beispiel“Einfaches Node.js-Skript zum Zipping, Prüfen der Integrität und Hochladen auf Capgo:
const fs = require('node:fs');const os = require('node:os');const AdmZip = require('adm-zip');const { checksum: getChecksum } = require('@tomasklaen/checksum');const fetch = require('node-fetch');
async function deployToCapgo() { const APP_ID = 'com.example.app'; const VERSION = '1.2.3'; const BUNDLE_URL = 'https://your-storage.com/bundles/app-1.2.3.zip'; const API_KEY = process.env.CAPGO_API_KEY;
// 1. Create zip (same as Capgo CLI) const zip = new AdmZip(); zip.addLocalFolder('./dist'); const zipped = zip.toBuffer();
// 2. Calculate checksum (same as Capgo CLI) const checksum = await getChecksum(zipped, 'sha256'); console.log('Checksum:', checksum);
// 3. Upload to your storage (replace with your upload logic) // fs.writeFileSync('./bundle.zip', zipped); // ... upload bundle.zip to your storage ...
// 4. Register with Capgo API const response = await fetch('https://api.capgo.app/bundle/', { method: 'POST', headers: { 'Content-Type': 'application/json', 'authorization': API_KEY }, body: JSON.stringify({ app_id: APP_ID, version: VERSION, external_url: BUNDLE_URL, checksum: checksum }) });
if (!response.ok) { throw new Error(`Failed: ${response.statusText}`); }
console.log('Bundle registered with Capgo!');}
deployToCapgo().catch(console.error);Abhängigkeiten installieren:
npm install adm-zip @tomasklaen/checksum node-fetchIntegritätsprüfung
Abschnitt mit dem Titel „Integritätsprüfung“JavaScript Prüfsummenberechnung (Gleich wie Capgo CLI)
Sektion mit dem Titel “JavaScript Prüfsummenberechnung (Gleich wie Capgo CLI)”Verwenden Sie die gleiche Paket- und Methode, die Capgo CLI intern verwendet:
const fs = require('node:fs');const { checksum: getChecksum } = require('@tomasklaen/checksum');
async function calculateChecksum(filePath) { const fileBuffer = fs.readFileSync(filePath); // Use exact same package and method as Capgo CLI const checksum = await getChecksum(fileBuffer, 'sha256'); return checksum;}
// Verify checksum matchesasync function verifyChecksum(filePath, expectedChecksum) { const actualChecksum = await calculateChecksum(filePath); const isValid = actualChecksum === expectedChecksum;
console.log(`File: ${filePath}`); console.log(`Expected: ${expectedChecksum}`); console.log(`Actual: ${actualChecksum}`); console.log(`Valid: ${isValid}`);
return isValid;}
// Usageasync function main() { const bundleChecksum = await calculateChecksum('./my-app-1.2.3.zip'); console.log('SHA256 Checksum:', bundleChecksum);}
main();Prüfsummenbedeutung
Sektion mit dem Titel “Prüfsummenbedeutung”- Bundle-Integrität: Stellt sicher, dass das Bundle während der Übertragung nicht beschädigt wurde
- API-Überprüfung: Capgo überprüft Prüfsummen, bevor es Bundles akzeptiert
- Plugin-Überprüfung: Das mobile Plugin überprüft Prüfsummen, bevor es Updates anwendet
Gute Praktiken
Abschnitt mit dem Titel „Gute Praktiken“- Bundle-Verwaltung (Version): Verwende semantische Versionsnummerierung konsistent
- Speicheroptimierung: Entferne periodisch nicht verwendete Bundles
- Kompatibilität von Bundles (Versionen): Setze angemessene Mindestanforderungen an die native Version
- Sicherheitsstrategie: Halte Backup-Kopien kritischer Bundles (Versionen) auf
Endpunkte
Abschnitt mit dem Titel „Endpunkte“https://api.capgo.app/bundle/
Bündelinformationen abrufen. Gibt 50 Bündel pro Seite zurück.
Abfrageparameter
Abschnitt mit dem Titel „Abfrageparameter“app_id: Pflichtfeld. Die ID Ihrer Apppage: Optional. Seitennummer für die Paginierung
Antworttyp
Abschnitt mit dem Titel „Antworttyp“interface Bundle { app_id: string bucket_id: string | null checksum: string | null created_at: string | null deleted: boolean external_url: string | null id: number minUpdateVersion: string | null name: string native_packages: Json[] | null owner_org: string r2_path: string | null session_key: string | null storage_provider: string updated_at: string | null user_id: string | null}Beispielanfrage
Abschnitt mit dem Titel „Beispielanfrage”# Get all bundlescurl -H "authorization: your-api-key" \ "https://api.capgo.app/bundle/?app_id=app_123"
# Get next pagecurl -H "authorization: your-api-key" \ "https://api.capgo.app/bundle/?app_id=app_123&page=1"Beispielantwort
Abschnitt mit dem Titel „Beispielantwort”{ "data": [ { "id": 1, "app_id": "app_123", "name": "1.0.0", "checksum": "abc123...", "minUpdateVersion": "1.0.0", "storage_provider": "r2", "created_at": "2024-01-01T00:00:00Z", "updated_at": "2024-01-01T00:00:00Z", "deleted": false, "owner_org": "org_123", "user_id": "user_123" } ]}https://api.capgo.app/bundle/
Lösche eine oder alle Pakete für eine App. Verwende dies mit Vorsicht, da diese Aktion nicht rückgängig gemacht werden kann.
Abfrageparameter
Abschnitt mit dem Titel „Abfrageparameter”Für die Löschung einer bestimmten Bundle:
interface BundleDelete { app_id: string version: string}Für die Löschung aller Bundles:
interface BundleDeleteAll { app_id: string}Beispielanfragen
Abschnitt mit dem Titel “Beispielanfragen”# Delete specific bundlecurl -X DELETE \ -H "authorization: your-api-key" \ -H "Content-Type: application/json" \ -d '{ "app_id": "app_123", "version": "1.0.0" }' \ https://api.capgo.app/bundle/
# Delete all bundlescurl -X DELETE \ -H "authorization: your-api-key" \ -H "Content-Type: application/json" \ -d '{ "app_id": "app_123" }' \ https://api.capgo.app/bundle/Erfolgsantwort
Abschnitt mit dem Titel “Erfolgsantwort”{ "status": "ok"}https://api.capgo.app/bundle/
Erstelle ein neues Bundle mit externer URL.
Anforderungskörper
Abschnitt mit dem Titel “Anforderungskörper”interface CreateBundleBody { app_id: string version: string external_url: string // Must be publicly accessible HTTPS URL checksum: string}Beispielanfrage
Abschnitt mit dem Titel “Beispielanfrage”curl -X POST \ -H "authorization: your-api-key" \ -H "Content-Type: application/json" \ -d '{ "app_id": "com.example.app", "version": "1.2.3", "external_url": "https://your-storage.com/bundles/app-1.2.3.zip", "checksum": "a1b2c3d4e5f6789abcdef123456789abcdef123456789abcdef123456789abcd" }' \ https://api.capgo.app/bundle/Erfolgsantwort
Abschnitt mit dem Titel “Erfolgsantwort”{ "status": "ok"}POST (Metadata)
Abschnitt mit dem Titel „POST (Metadata)“https://api.capgo.app/bundle/metadata
Bundle-Metadaten wie Link- und Kommentarinformationen aktualisieren.
Anforderungskörper
Abschnitt mit dem Titel „Anforderungskörper“interface UpdateMetadataBody { app_id: string version_id: number // bundle (version) id link?: string comment?: string}Beispielanfrage
Abschnitt mit dem Titel „Beispielanfrage“curl -X POST \ -H "authorization: your-api-key" \ -H "Content-Type: application/json" \ -d '{ "app_id": "app_123", "version_id": 456, "link": "https://github.com/myorg/myapp/releases/tag/v1.0.0", "comment": "Fixed critical bug in authentication" }' \ https://api.capgo.app/bundle/metadataErfolgsantwort
Abschnitt mit dem Titel „Erfolgsantwort“{ "status": "success"}https://api.capgo.app/bundle/
Eine Bundle zu einem bestimmten Kanal setzen. Dies verknüpft eine Bundle (Version) mit einem Kanal für die Verteilung.
Anforderungskörper
Abschnitt mit dem Titel “Anforderungskörper”interface SetChannelBody { app_id: string version_id: number // bundle (version) id channel_id: number}Beispielanfrage
Abschnitt mit dem Titel “Beispielanfrage”curl -X PUT \ -H "authorization: your-api-key" \ -H "Content-Type: application/json" \ -d '{ "app_id": "app_123", "version_id": 456, "channel_id": 789 }' \ https://api.capgo.app/bundle/Antwort mit Erfolg
Erfolgsantwort{ "status": "success", "message": "Bundle 1.0.0 set to channel production"}Fehlerbehandlung
Abschnitt: FehlerbehandlungHäufige Fehlerfälle und ihre Antworten:
// Bundle not found{ "error": "Bundle not found", "status": "KO"}
// Invalid bundle (version) format{ "error": "Invalid version format", "status": "KO"}
// Storage error{ "error": "Failed to delete bundle from storage", "status": "KO"}
// Permission denied{ "error": "Insufficient permissions to manage bundles", "status": "KO"}Häufige Anwendungsfälle
Abschnitt: Häufige Anwendungsfälle- Alte Bundle (Versionen) löschen
// Delete outdated beta bundles (versions){ "app_id": "app_123", "version": "1.0.0-beta.1"}- App-Neustart
// Remove all bundles to start fresh{ "app_id": "app_123"}Speicherbedenken
Abschnitt mit dem Titel „Speicherbedenken“- Rückhaltepolitik: Definieren Sie, wie lange alte Pakete aufbewahrt werden sollen
- Größenmanagement: Überwachen Sie die Größe der Pakete und die Speicherverwaltung
- Sicherheitsstrategie: Überlegen Sie, ob Sie kritische Pakete (Versionen) sichern sollten
- Kostenoptimierung: Entfernen Sie unnötige Pakete, um die Speicherkosten zu optimieren
Weiter von Paketen
Abschnitt mit dem Titel „Weiter von Paketen“If Sie mit verwenden Bündel um den Speicher und die Dateihandling zu planen, verbinden Sie es mit @capgo/capacitor-data-storage-sqlite zur Implementierungsdetail in @capgo/capacitor-data-storage-sqlite, Mit @capgo/capacitor-data-storage-sqlite zur nativen Fähigkeit in Mit @capgo/capacitor-data-storage-sqlite, @capgo/capacitor-file zur Implementierungsdetail in @capgo/capacitor-file, Mit @capgo/capacitor-file zur nativen Fähigkeit in Mit @capgo/capacitor-file, und @capgo/capacitor-uploader für die Implementierungsdetails in @capgo/capacitor-Uploader.