バンドル
このプラグインのインストールステップとフルマークダウンガイドを含むセットアッププロンプトをコピーできます。
Bundles are the core update packages in Capgo. Each bundle contains the web assets (HTML, CSS, JS) that make up your app’s content. The Bundles API allows you to manage these update packages, including listing and deleting them.
Understanding Bundles
「バンドルを理解する」バンドルは、特定のバージョンのアプリのウェブコンテンツを表し、次の情報を含みます:
- バンドル (バージョン): バンドル (バージョン) の セマンティック バージョン番号
- バンドルのチェックサム
- : バンドルの整合性を検証する一意のハッシュストレージ情報
- : バンドルがどのように保存されているかについての詳細ネイティブ要件
- : バンドルが保存されている最小のネイティブアプリのバージョン要件: __CAPGO_KEEP_0__の作成日時、所有権、その他の追跡情報
手動でCLIを作成する
「手動でCLIを作成する」ここでは、Capgoを使用せずに、CLIを使用してバンドルを作成してアップロードする方法を説明します。
ステップ 1: アプリをビルドする
「ステップ 1: アプリをビルドする」まず、アプリのウェブアセットをビルドしてください。
npm run buildStep 2: Create Bundle Zip Using Same Packages as Capgo CLI
Section titled “Step 2: Create Bundle Zip Using Same Packages as Capgo CLI”注意: このページは、バグ赏金プログラムのページです。ロールは、UIラベルです。ページ bug-bounty.astro で見られます。メッセージキーは `bug_bounty_important_label` (バグ賞金注意ラベル) です。: Capgo CLI の内部で使用している同じ JavaScript パッケージを使用して、互換性を確保します。
必要なパッケージをインストールする
「必要なパッケージをインストールする」npm install adm-zip @tomasklaen/checksumJavaScript で Capgo CLI と同じように Zip アーカイブを作成する
「JavaScript で Capgo CLI と同じように Zip アーカイブを作成する」注: 以下の例では、 version refers to the bundle (version) name used by the 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();Step 3: Calculate SHA256 Checksum Using Same Package as CLI
ステップ 3: CLI と同じパッケージを使用して SHA256 チェックサムを計算する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();ステップ 4: バンドルを保存先にアップロード
「ステップ 4: バンドルを保存先にアップロード」任意のウェブアクセス可能な保存先に、zip ファイルをアップロードしてください:
# 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"重要ページ/エリア: バグバウンティプログラムページ。役割: UI ラベル。見られる場所: page bug-bounty.astro。メッセージキー `bug_bounty_important_label` (バグバウンティーアイマークラベル)。 バンドルは via HTTPS URL (no authentication required). Capgo’s servers need to download the bundle from this URL.
HTTPS URL (認証なし) でのみアクセス可能でなければなりません。__CAPGO_KEEP_0__のサーバーは、このURLからバンドルをダウンロードする必要があります。
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
Step 5: Register Bundle with Capgo API
Section titled “Step 5: エスタインター、パックコンター、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 パックコンター、パックコンター、__CAPGO_KEEP_1__ にためいなただ。
パックコンター、パックコンター、API にためいなただ。| パックコンター、パックコンター、__CAPGO_KEEP_0__ にためいなただ。 | パックコンター、パックコンター、__CAPGO_KEEP_0__ にためいなただ。 | パックコンター、パックコンター、__CAPGO_KEEP_0__ にためいなただ。 |
|---|---|---|
app_id | パックコンター、パックコンター、__CAPGO_KEEP_0__ にためいなただ。 | パックコンター、パックコンター、__CAPGO_KEEP_0__ にためいなただ。 |
version | パックコンター、パックコンター、__CAPGO_KEEP_0__ にためいなただ。 パックコンター、パックコンター、__CAPGO_KEEP_0__ にためいなただ。 (例:「1.2.3」) | はい |
external_url | パブリックにアクセス可能 HTTPS URL からバンドルをダウンロードできる場所 (認証なし) | はい |
checksum | zip ファイルの SHA256 チェックサム | はい |
バンドル構造要件
バンドル構造要件のセクションあなたのバンドル zip は次の要件を満たす必要があります:
- ルート インデックス ファイル: 必ず
index.htmlrootレベルで - Capacitor統合: 必ず呼び出す
notifyAppReady()アプリケーション内でcode - アセットパス: アセットのすべてのパスを相対パスで使用する
有効なバンドル構造
セクション「有効なバンドル構造」bundle.zip├── index.html├── assets/│ ├── app.js│ └── styles.css└── images/完全な手動ワークフロー例
セクション「完全な手動ワークフロー例」Node.jsスクリプトを簡単に作成して、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);依存関係をインストール:
npm install adm-zip @tomasklaen/checksum node-fetchチェックサム検証
「チェックサム検証」のセクションCapgoとCLIで使用されるJavaScriptのチェックサム計算 (同等)
「CapgoとCLIで使用されるJavaScriptのチェックサム計算 (同等)」のセクションCapgoと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;}
// 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();チェックサムの重要性
「チェックサムの重要性」のセクション- バンドル統合: 転送中のバンドルが損傷していないことを確認します
- API 検証: Capgo はチェックサムを検証し、バンドルを受け入れる前にチェックします
- プラグイン検証: モバイル プラグインはアップデートを適用する前にチェックサムを検証します
ベスト プラクティス
「ベスト プラクティス」のセクション- バンドル (バージョン) 管理: シームレス バージョニングを 一貫して使用してください
- ストレージ最適化: 不要なバンドルを定期的に削除する
- バンドル(バージョン)互換性: 適切なネイティブ最小バージョン要件を設定する
- バックアップ戦略: 重要なバンドル(バージョン)のバックアップを維持する
エンドポイント
エンドポイントGET
GEThttps://api.capgo.app/bundle/
バンドル情報を取得する。1ページあたり50バンドルを返す。
クエリパラメータ
「クエリ パラメータ」app_id: 必須。アプリ IDpage: 任意。ページ番号 (ページネーション用)
レスポンス形式
「レスポンス形式」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}例のリクエスト
「例のリクエスト」# 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"例のレスポンス
「例のレスポンス」{ "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" } ]}DELETE
「DELETE」のセクションhttps://api.capgo.app/bundle/
アプリのバンドルを1つまたはすべて削除します。削除は取り消すことができませんので、ご注意ください。
クエリ パラメータ
「クエリ パラメータ」のセクション特定のバンドルを削除する場合:
interface BundleDelete { app_id: string version: string}すべてのバンドルを削除する場合:
interface BundleDeleteAll { app_id: string}削除の例
「削除の例」のセクション# 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/成功レスポンス
「成功レスポンス」のセクション{ "status": "ok"}POST
「POST」のセクションhttps://api.capgo.app/bundle/
外部URLで新しいバンドルを作成します。
リクエストボディ
「リクエストボディ」のセクションinterface CreateBundleBody { app_id: string version: string external_url: string // Must be publicly accessible HTTPS URL checksum: string}例のリクエスト
Section titled “サンプルリクエスト”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/成功レスポンス
Section titled “成功レスポンス”{ "status": "ok"}POST (メタデータ)
Section titled “POST (メタデータ)”https://api.capgo.app/bundle/metadata
バンドルメタデータの更新(リンクやコメント情報など)
リクエストボディ
Section titled “リクエストボディ”interface UpdateMetadataBody { app_id: string version_id: number // bundle (version) id link?: string comment?: string}サンプル リクエスト
サブセクション: サンプル リクエスト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/metadata成功応答
サブセクション: 成功応答{ "status": "success"}PUT
セクション: PUThttps://api.capgo.app/bundle/
特定のチャンネルにバンドルを設定します。このリンクはバンドル (バージョン) をチャンネルに分配するために使用されます。
リクエスト ボディ
サブセクション: リクエスト ボディinterface SetChannelBody { app_id: string version_id: number // bundle (version) id channel_id: number}例のリクエスト
「例のリクエスト」のセクション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/成功レスポンス
「成功レスポンス」のセクション{ "status": "success", "message": "Bundle 1.0.0 set to channel production"}エラー処理
「エラー処理」のセクション一般的なエラーシナリオとそのレスポンス:
// 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"}共通の使用例
「共通の使用例」セクション- 古いバンドル (バージョン) のクリーンアップ
// Delete outdated beta bundles (versions){ "app_id": "app_123", "version": "1.0.0-beta.1"}- アプリケーション リセット
// Remove all bundles to start fresh{ "app_id": "app_123"}ストレージの考慮事項
「ストレージの考慮事項」セクション- 保持ポリシー:古いバンドルの保持期間を定義する
- サイズ管理:バンドルのサイズとストレージ使用量を監視する
- バックアップ戦略: バックアップする必要がある重要なバンドル (バージョン) を考慮してください
- コスト最適化: 必要なバンドルを削除してストレージコストを最適化する
バンドルから続けて
「バンドルから続けて」のセクションCapgo を使用している場合 バンドル ストレージとファイルの管理を計画するために使用している場合、@__CAPGO_KEEP_0__/__CAPGO_KEEP_1__-data-storage-sqlite に接続してください Capgo の実装詳細については @capgo/capacitor-data-storage-sqlite を参照してください @capgo/capacitor-data-storage-sqlite を使用しています @capgo/capacitor-data-storage-sqlite Capacitorのネイティブ機能を使用するために@capgo/capacitor-data-storage-sqliteを使用します。 @capgo/capacitor-file Capacitorの実装詳細を表示するために@capgo/capacitor-fileを使用します。 Capacitorの機能を使用するために@capgo/capacitor-fileを使用します。 Capacitorのネイティブ機能を使用するために@capgo/capacitor-fileを使用し、 @capgo/capacitor-uploader Capacitorの実装詳細を表示するために@capgo/capacitor-uploaderを使用します。