Skip to content

マイグレーションガイド

このガイドは、Traeの異なるバージョン間でのマイグレーションと、拡張機能、設定、プロジェクトのアップグレードを支援します。

概要

Traeは以下を支援するマイグレーションツールとガイドを提供します:

  • 古いバージョンから新しいバージョンへのアップグレード
  • 拡張機能とプラグインのマイグレーション
  • 設定ファイルと設定の更新
  • レガシープロジェクトとワークスペースの変換
  • 破壊的変更と非推奨機能の処理
  • カスタム設定とデータの保持

バージョンマイグレーション

Trae 2.x から 3.x

破壊的変更

  • API変更: いくつかのAPIが新しいシグネチャで更新されました
  • 設定フォーマット: 設定フォーマットがモダン化されました
  • 拡張システム: 改善された機能を持つ新しい拡張アーキテクチャ
  • プラグインインターフェース: パフォーマンス向上のためのプラグインインターフェースの更新

マイグレーション手順

  1. データのバックアップ

    bash
    # ワークスペースをバックアップ
    cp -r ~/.trae ~/.trae-backup
    
    # プロジェクト設定をバックアップ
    find . -name ".trae" -type d -exec cp -r {} {}.backup \;
  2. 設定ファイルの更新

    typescript
    // 古いフォーマット (v2.x)
    {
      "editor": {
        "fontSize": 14,
        "theme": "dark"
      }
    }
    
    // 新しいフォーマット (v3.x)
    {
      "editor.fontSize": 14,
      "workbench.colorTheme": "dark"
    }
  3. 拡張機能の更新

    bash
    # インストール済み拡張機能をリスト表示
    trae --list-extensions
    
    # すべての拡張機能を更新
    trae --update-extensions
    
    # 互換性のない拡張機能を再インストール
    trae --reinstall-extensions
  4. カスタム設定のマイグレーション

    typescript
    import { MigrationTool } from '@trae/migration';
    
    const migrator = new MigrationTool();
    
    // 設定をマイグレーション
    await migrator.migrateSettings({
      from: '2.x',
      to: '3.x',
      settingsPath: '~/.trae/settings.json'
    });
    
    // キーバインディングをマイグレーション
    await migrator.migrateKeybindings({
      from: '2.x',
      to: '3.x',
      keybindingsPath: '~/.trae/keybindings.json'
    });

Trae 1.x から 2.x

主要な変更

  • ワークスペースフォーマット: 新しいワークスペースファイル構造
  • テーマシステム: 強化されたテーマ機能
  • 言語サポート: 改善された言語サーバー統合
  • デバッグ設定: 更新されたデバッグインターフェース

マイグレーションプロセス

  1. ワークスペースファイルの変換

    typescript
    import { WorkspaceMigrator } from '@trae/migration';
    
    const migrator = new WorkspaceMigrator();
    
    // ワークスペースを変換
    await migrator.convertWorkspace({
      source: './project.trae-workspace',
      target: './project.code-workspace',
      version: '2.x'
    });
  2. 起動設定の更新

    json
    // 古いフォーマット (v1.x)
    {
      "version": "0.1.0",
      "configurations": [
        {
          "name": "Launch",
          "type": "node",
          "program": "${workspaceRoot}/app.js"
        }
      ]
    }
    
    // 新しいフォーマット (v2.x)
    {
      "version": "0.2.0",
      "configurations": [
        {
          "name": "Launch",
          "type": "node",
          "program": "${workspaceFolder}/app.js",
          "console": "integratedTerminal"
        }
      ]
    }

拡張機能のマイグレーション

API更新

コマンド登録

typescript
// 古いAPI (v2.x)
context.subscriptions.push(
  trae.commands.registerCommand('extension.myCommand', () => {
    // コマンドロジック
  })
);

// 新しいAPI (v3.x)
context.subscriptions.push(
  trae.commands.registerCommand('extension.myCommand', {
    handler: () => {
      // コマンドロジック
    },
    enablement: 'editorHasSelection'
  })
);

設定アクセス

typescript
// 古いAPI (v2.x)
const config = trae.workspace.getConfiguration('myExtension');
const value = config.get('setting');

// 新しいAPI (v3.x)
const config = trae.workspace.getConfiguration();
const value = config.get('myExtension.setting');

イベント処理

typescript
// 古いAPI (v2.x)
trae.workspace.onDidChangeTextDocument((event) => {
  // 変更を処理
});

// 新しいAPI (v3.x)
trae.workspace.onDidChangeTextDocument((event) => {
  // 改善されたイベントデータで変更を処理
}, null, context.subscriptions);

拡張機能マニフェストの更新

json
// 古いマニフェスト (v2.x)
{
  "name": "my-extension",
  "version": "1.0.0",
  "engines": {
    "trae": "^2.0.0"
  },
  "activationEvents": [
    "onLanguage:javascript"
  ]
}

// 新しいマニフェスト (v3.x)
{
  "name": "my-extension",
  "version": "2.0.0",
  "engines": {
    "trae": "^3.0.0"
  },
  "activationEvents": [
    "onLanguage:javascript"
  ],
  "capabilities": {
    "virtualWorkspaces": true,
    "untrustedWorkspaces": {
      "supported": true
    }
  }
}

設定のマイグレーション

設定のマイグレーション

typescript
import { SettingsMigrator } from '@trae/migration';

class SettingsMigrator {
  async migrateSettings(options: MigrationOptions): Promise<void> {
    const oldSettings = await this.loadSettings(options.from);
    const newSettings = this.transformSettings(oldSettings, options.to);
    await this.saveSettings(newSettings, options.to);
  }

  private transformSettings(oldSettings: any, targetVersion: string): any {
    const newSettings: any = {};
    
    // エディター設定を変換
    if (oldSettings.editor) {
      newSettings['editor.fontSize'] = oldSettings.editor.fontSize;
      newSettings['editor.fontFamily'] = oldSettings.editor.fontFamily;
      newSettings['editor.tabSize'] = oldSettings.editor.tabSize;
    }
    
    // ワークベンチ設定を変換
    if (oldSettings.workbench) {
      newSettings['workbench.colorTheme'] = oldSettings.workbench.theme;
      newSettings['workbench.iconTheme'] = oldSettings.workbench.iconTheme;
    }
    
    // 拡張機能設定を変換
    if (oldSettings.extensions) {
      for (const [key, value] of Object.entries(oldSettings.extensions)) {
        newSettings[`extensions.${key}`] = value;
      }
    }
    
    return newSettings;
  }
}

キーバインディングのマイグレーション

typescript
import { KeybindingsMigrator } from '@trae/migration';

class KeybindingsMigrator {
  async migrateKeybindings(options: MigrationOptions): Promise<void> {
    const oldKeybindings = await this.loadKeybindings(options.from);
    const newKeybindings = this.transformKeybindings(oldKeybindings);
    await this.saveKeybindings(newKeybindings, options.to);
  }

  private transformKeybindings(oldKeybindings: any[]): any[] {
    return oldKeybindings.map(binding => {
      // コマンド名を更新
      if (binding.command === 'workbench.action.files.openFile') {
        binding.command = 'workbench.action.files.openFileFolder';
      }
      
      // キーの組み合わせを更新
      if (binding.key === 'ctrl+shift+p') {
        binding.key = 'cmd+shift+p';
      }
      
      return binding;
    });
  }
}

データのマイグレーション

ワークスペースデータ

typescript
import { WorkspaceDataMigrator } from '@trae/migration';

class WorkspaceDataMigrator {
  async migrateWorkspaceData(workspacePath: string): Promise<void> {
    const workspaceData = await this.loadWorkspaceData(workspacePath);
    
    // プロジェクト設定をマイグレーション
    if (workspaceData.settings) {
      workspaceData.settings = this.migrateProjectSettings(workspaceData.settings);
    }
    
    // 起動設定をマイグレーション
    if (workspaceData.launch) {
      workspaceData.launch = this.migrateLaunchConfigurations(workspaceData.launch);
    }
    
    // タスクをマイグレーション
    if (workspaceData.tasks) {
      workspaceData.tasks = this.migrateTasks(workspaceData.tasks);
    }
    
    await this.saveWorkspaceData(workspacePath, workspaceData);
  }

  private migrateProjectSettings(settings: any): any {
    // プロジェクト固有の設定を変換
    const migratedSettings = { ...settings };
    
    // ファイル関連付けを更新
    if (settings.files?.associations) {
      migratedSettings['files.associations'] = settings.files.associations;
      delete migratedSettings.files;
    }
    
    return migratedSettings;
  }

  private migrateLaunchConfigurations(launch: any): any {
    return {
      ...launch,
      version: '0.2.0',
      configurations: launch.configurations.map((config: any) => ({
        ...config,
        program: config.program?.replace('${workspaceRoot}', '${workspaceFolder}'),
        console: config.console || 'integratedTerminal'
      }))
    };
  }
}

拡張機能データ

typescript
import { ExtensionDataMigrator } from '@trae/migration';

class ExtensionDataMigrator {
  async migrateExtensionData(extensionId: string): Promise<void> {
    const extensionData = await this.loadExtensionData(extensionId);
    
    // 拡張機能の状態をマイグレーション
    if (extensionData.state) {
      extensionData.state = this.migrateExtensionState(extensionData.state);
    }
    
    // 拡張機能の設定をマイグレーション
    if (extensionData.settings) {
      extensionData.settings = this.migrateExtensionSettings(extensionData.settings);
    }
    
    await this.saveExtensionData(extensionId, extensionData);
  }

  private migrateExtensionState(state: any): any {
    // 拡張機能の状態データを変換
    const migratedState = { ...state };
    
    // 状態構造を更新
    if (state.version === '1.0') {
      migratedState.version = '2.0';
      migratedState.data = this.transformStateData(state.data);
    }
    
    return migratedState;
  }
}

マイグレーションツール

CLIマイグレーションツール

bash
# マイグレーションツールをインストール
npm install -g @trae/migration-cli

# マイグレーションを実行
trae-migrate --from 2.x --to 3.x --workspace ./my-project

# ドライラン(変更をプレビュー)
trae-migrate --from 2.x --to 3.x --workspace ./my-project --dry-run

# 特定のコンポーネントをマイグレーション
trae-migrate --from 2.x --to 3.x --settings-only
trae-migrate --from 2.x --to 3.x --extensions-only
trae-migrate --from 2.x --to 3.x --workspace-only

プログラマティックマイグレーション

typescript
import { MigrationManager } from '@trae/migration';

const migrationManager = new MigrationManager();

// 完全なマイグレーションを実行
await migrationManager.migrate({
  from: '2.x',
  to: '3.x',
  workspace: './my-project',
  backup: true,
  dryRun: false
});

// 選択的マイグレーションを実行
await migrationManager.migrateSelective({
  from: '2.x',
  to: '3.x',
  components: ['settings', 'keybindings', 'extensions'],
  workspace: './my-project'
});

トラブルシューティング

よくある問題

  1. 拡張機能の互換性

    • 新しいバージョンとの拡張機能の互換性を確認
    • 互換性のない拡張機能を更新または置換
    • 拡張機能の作者に問題を報告
  2. 設定の競合

    • マイグレーションされた設定の競合を確認
    • 問題のある設定をデフォルトにリセット
    • 複雑な設定を手動で調整
  3. データ損失の防止

    • マイグレーション前に必ずバックアップ
    • マイグレーション結果を検証
    • マイグレーションが成功確認されるまでバックアップを保持

復旧手順

bash
# バックアップから復元
cp -r ~/.trae-backup ~/.trae

# デフォルトにリセット
trae --reset-settings
trae --reset-keybindings

# 拡張機能を再インストール
trae --uninstall-all-extensions
trae --install-extensions-from-backup

ベストプラクティス

  1. マイグレーション前

    • 完全なバックアップを作成
    • カスタム設定を文書化
    • 非本番環境でマイグレーションをテスト
    • 破壊的変更のドキュメントを確認
  2. マイグレーション中

    • 最初にドライランを実行
    • 段階的にマイグレーション
    • 各ステップを検証
    • 詳細なログを保持
  3. マイグレーション後

    • すべての機能をテスト
    • ドキュメントを更新
    • チームメンバーに変更を教育
    • 問題を監視

関連リソース

究極の AI 駆動 IDE 学習ガイド