Bundles
Salin prompt pengaturan dengan langkah instalasi dan panduan markdown lengkap untuk plugin ini.
Paket Bundel adalah paket pembaruan inti di Capgo. Setiap bundel mengandung aset web (HTML, CSS, JS) yang membentuk konten aplikasi Anda. Paket Bundel API memungkinkan Anda mengelola paket pembaruan ini, termasuk menampilkan dan menghapusnya.
Mengerti Paket Bundel
Bab yang berjudul “Mengerti Paket Bundel”Paket bundel mewakili versi tertentu konten web aplikasi Anda dan mencakup:
- Paket (versi): Nomor versi semantik untuk paket untuk paket
- Checksum: Hash unik untuk memverifikasi integritas paket
- Info Penyimpanan: Detail tentang di mana dan bagaimana paket disimpan
- Kebutuhan Nativ : Persyaratan versi aplikasi natif minimal
- Metadata: Waktu pembuatan, kepemilikan, dan informasi lainnya untuk tracking
Pembuatan Paket Tangan (Tanpa CLI)
Bagian berjudul “Pembuatan Paket Manual (Tanpa CLI)”Berikut cara membuat dan mengunggah paket manual tanpa menggunakan Capgo CLI:
Langkah 1: Bangun Aplikasi Anda
Bagian berjudul “Langkah 1: Bangun Aplikasi Anda”Pertama, bangun aset web aplikasi Anda:
npm run buildLangkah 2: Buat Paket Zip Menggunakan Paket yang Sama dengan Capgo CLI
Bagian berjudul “Langkah 2: Buat Paket Zip Menggunakan Paket yang Sama dengan Capgo CLI”Penting: Gunakan paket JavaScript yang sama persis yang digunakan oleh Capgo CLI untuk memastikan konsistensi.
Pasang Paket yang Diperlukan
Bagian berjudul “Pasang Paket yang Diperlukan”npm install adm-zip @tomasklaen/checksumBuat Arsip Zip dengan JavaScript (Sama seperti Capgo CLI)
Bagian berjudul “Buat Arsip Zip dengan JavaScript (Sama seperti Capgo CLI)”Catatan: Dalam contoh-contoh di bawah ini, version merujuk pada nama arsip (versi) yang digunakan oleh API.
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();Langkah 3: Hitung Ceksum SHA256 Menggunakan Paket yang Sama seperti CLI
Bagian berjudul “Langkah 3: Hitung Ceksum SHA256 Menggunakan Paket yang Sama seperti 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();Langkah 4: Unggah Arsip ke Penyimpanan Anda
Bagian berjudul “Langkah 4: Unggah Paket ke Penyimpanan Anda”Unggah file zip Anda ke penyimpanan web yang dapat diakses:
# 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"Penting: Paket Anda harus tersedia secara publik melalui URL HTTPS (tidak memerlukan autentikasi). Server Capgo memerlukan untuk mengunduh paket dari URL ini.
Contoh URL publik yang valid:
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
Langkah 5: Daftarkan Paket dengan Capgo API
Bagian berjudul “Langkah 5: Daftarkan Paket dengan Capgo API”Daftarkan paket eksternal dengan Capgo menggunakan panggilan API langsung:
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 Parameter
Bagian berjudul “API Parameter”| Parameter | Deskripsi | Diperlukan |
|---|---|---|
app_id | Identifikasi aplikasi Anda | Ya |
version | Paket (versi) versi semantik (misalnya, “1.2.3”) | Ya |
external_url | Terbuka untuk umum URL HTTPS yang dapat diakses publik untuk mengunduh bundle (tidak memerlukan autentikasi) | Ya |
checksum | Checksum SHA256 dari file zip | Ya |
Persyaratan Struktur Bundle
Bab berjudul “Persyaratan Struktur Bundle”Bundle zip Anda harus memenuhi persyaratan berikut:
- File Index Utama: Harus ada
index.htmldi tingkat root - Integrasi CapacitorWajib memanggil
notifyAppReady()dalam aplikasi Anda code - Rute Asset: Gunakan rute relatif untuk semua asset
Struktur Paket yang Sah
Bab berjudul “Struktur Paket yang Sah”bundle.zip├── index.html├── assets/│ ├── app.js│ └── styles.css└── images/Contoh Penuh Alur Manual
Bab berjudul “Contoh Penuh Alur Manual”Skrip Node.js Sederhana untuk mengompresi, checksum, dan mengunggah ke 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);Instal dependensi:
npm install adm-zip @tomasklaen/checksum node-fetchVerifikasi Cek Pencacahan
Bagian berjudul “Verifikasi Cek Pencacahan”Penghitungan Cek Pencacahan JavaScript (Sama seperti Capgo CLI)
Bagian berjudul “Penghitungan Cek Pencacahan JavaScript (Sama seperti Capgo CLI)”Gunakan paket dan metode yang sama persis seperti Capgo CLI yang digunakan secara internal:
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();Ketetapan Cek Pencacahan
Bagian berjudul “Ketetapan Cek Pencacahan”- Integritas Paket: Menjamin paket tidak rusak selama pengiriman
- Verifikasi API: Capgo memverifikasi checksum sebelum menerima bundle
- Verifikasi Plugin: Plugin mobile memverifikasi checksum sebelum menerapkan update
Praktik Terbaik
: Bagian berjudul “Praktik Terbaik”- Pengelolaan Bundle (versi): Gunakan versi semantik secara konsisten Optimasi Penyimpanan
- : Hapus bundle yang tidak digunakan secara berkalaPenggunaan __CAPGO_KEEP_0__
- Kompatibilitas Paket (versi): Tentukan persyaratan versi native minimum yang tepat
- Strategi Cadangan: Jaga cadangan paket kritis (versi)
Endpoint
Bagian berjudul “Endpoint”https://api.capgo.app/bundle/
Mengambil informasi paket. Mengembalikan 50 paket per halaman.
Parameter Pemintaan
Bagian berjudul “Parameter Pemintaan”app_id: Wajib. ID aplikasi Andapage: Opsional. Nomor halaman untuk pagination
Jenis Respon
Bagian berjudul “Jenis Respon”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}Contoh Permintaan
Bagian berjudul “Contoh Permintaan”# 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"Contoh Respon
Bagian berjudul “Contoh Respon”{ "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" } ]}Hapus (DELETE)
Hapus satu atau semua bundle untuk aplikasi. Gunakan dengan hati-hati karena aksi ini tidak dapat dibatalkan.https://api.capgo.app/bundle/
Hapus satu bundle tertentu:
Salin ke clipboard
Hapus semua bundle:Salin ke clipboard
interface BundleDelete { app_id: string version: string}Hapus satu atau semua bundle untuk aplikasi. Gunakan dengan hati-hati karena aksi ini tidak dapat dibatalkan.
interface BundleDeleteAll { app_id: string}Hapus satu bundle tertentu:
Hapus semua bundle:# 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/Respons Sukses
Bagian Judul “Respons Sukses”{ "status": "ok"}https://api.capgo.app/bundle/
Buat bundle baru dengan URL eksternal.
Tubuh Permintaan
Bagian Judul “Tubuh Permintaan”interface CreateBundleBody { app_id: string version: string external_url: string // Must be publicly accessible HTTPS URL checksum: string}Contoh Permintaan
Bagian Judul “Contoh Permintaan”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/Respon Berhasil
Bagian berjudul “Respon Berhasil”{ "status": "ok"}POST (Metadata)
Bagian berjudul “POST (Metadata)”https://api.capgo.app/bundle/metadata
Perbarui metadata paket seperti informasi link dan komentar.
Badan Permintaan
Bagian berjudul “Badan Permintaan”interface UpdateMetadataBody { app_id: string version_id: number // bundle (version) id link?: string comment?: string}Contoh Permintaan
Bagian berjudul “Contoh Permintaan”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/metadataRespons Berhasil
Bab berjudul “Respons Berhasil”{ "status": "success"}https://api.capgo.app/bundle/
Setel sebuah paket ke sebuah saluran tertentu. Ini menghubungkan sebuah paket (versi) ke sebuah saluran untuk distribusi.
Badan Permintaan
Bab berjudul “Badan Permintaan”interface SetChannelBody { app_id: string version_id: number // bundle (version) id channel_id: number}Contoh Permintaan
Bagian berjudul “Contoh Permintaan”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/Respons Berhasil
Bagian berjudul “Respons Berhasil”{ "status": "success", "message": "Bundle 1.0.0 set to channel production"}Pengelolaan Kesalahan
Bagian berjudul “Pengelolaan Kesalahan”Skenario kesalahan umum dan responsnya:
// 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"}Penggunaan Umum
Bagian berjudul “Penggunaan Umum”- Pembersihan Paket Lama (Versi)
// Delete outdated beta bundles (versions){ "app_id": "app_123", "version": "1.0.0-beta.1"}- Pulihkan Aplikasi
// Remove all bundles to start fresh{ "app_id": "app_123"}Pertimbangan Penyimpanan
Bab yang berjudul “Pertimbangan Penyimpanan”- Kebijakan Retensi: Tentukan berapa lama menyimpan paket lama
- Pengelolaan Ukuran: Pantau ukuran paket dan penggunaan penyimpanan
- Strategi Cadangan: Pertimbangkan untuk mengcadangkan paket kritis (versi)
- Optimasi Biaya: Hapus bundle yang tidak perlu untuk mengoptimalkan biaya penyimpanan
Teruskan dari Bundles
Judul Bagian “Teruskan dari Bundles”Jika Anda menggunakan Bundles untuk merencanakan penyimpanan dan pengelolaan file, hubungkannya dengan @capgo/capacitor-data-storage-sqlite untuk detail implementasi di @capgo/capacitor-data-storage-sqlite, Menggunakan @capgo/capacitor-data-storage-sqlite untuk kemampuan asli di Menggunakan @capgo/capacitor-data-storage-sqlite, @capgo/capacitor-file untuk detail implementasi di @capgo/capacitor-file, Menggunakan @capgo/capacitor-file untuk kemampuan asli di Menggunakan @capgo/capacitor-file, dan @capgo/capacitor-uploader untuk detail implementasi di @capgo/capacitor-uploader.