{"meta":{"title":"GitHub Codespaces に深く迫る","intro":"GitHub Codespaces のしくみについて詳しく説明します。","product":"Codespaces","breadcrumbs":[{"href":"/ja/codespaces","title":"Codespaces"},{"href":"/ja/codespaces/about-codespaces","title":"作業の開始"},{"href":"/ja/codespaces/about-codespaces/deep-dive","title":"Codespaces の詳細"}],"documentType":"article"},"body":"# GitHub Codespaces に深く迫る\n\nGitHub Codespaces のしくみについて詳しく説明します。\n\nGitHub Codespaces は、クラウドベースのインスタント開発環境であり、コンテナーを使用して開発用の共通言語、ツール、ユーティリティを提供します。 また、GitHub Codespaces は構成可能で、プロジェクトに合わせてカスタマイズされた開発環境を作成できます。 プロジェクト用のカスタム開発環境を構成することにより、プロジェクトのすべてのユーザーに対して繰り返し可能な codespace 構成を作成できます。\n\n## codespace を作成する\n\ncodespace を作成するためのエントリ ポイントは数多くあります。\n\n* GitHub テンプレートまたは GitHub の任意のテンプレート リポジトリから新しいプロジェクトの開始\n* 新機能の作業を行うリポジトリ内のブランチから\n* 進行中の作業を探索するオープンの pull request から\n* リポジトリの履歴中のコミットから特定の時点でのバグを調査するために\n\ncodespace は、GitHub、Visual Studio Code、または GitHub CLI を使用して作成できます。\n\n何らかのテストを行う必要がある場合、または同じ codespace に戻って長期間の機能作業を行うことができる場合、codespace をエフェメラルにすることができます。\n\n詳細については、「[リポジトリの codespace を作成する](/ja/codespaces/developing-in-a-codespace/creating-a-codespace-for-a-repository)」、「[テンプレートから codespace を作成する](/ja/codespaces/developing-in-a-codespace/creating-a-codespace-from-a-template)」、「[既存の codespace を開く](/ja/codespaces/developing-in-a-codespace/opening-an-existing-codespace)」を参照してください。\n\n> \\[!NOTE]\n> リポジトリごと、さらにはブランチごとに1つ以上のcodespaceを作成できます。 ただし、作成できる codespace の数と、同時に実行できる codespace の数には制限があります。 codespace の最大数に達してからさらに作成しようとすると、新しい codespace を作成する前に既存のものを削除する必要があることを示すメッセージが表示されます。\n\n### codespace の作成プロセス\n\ncodespace を作成するときは、codespace を使用できるようになるまでにバックグラウンドでさまざまな手順が発生します。\n\n### 手順 1: VM とストレージを codespace に割り当てる\n\nコードスペースを作成すると、VM ホスト イメージの安定リリースまたは パブリック プレビュー リリースを使用して仮想マシン (VM) が作成されます。 詳しくは、「[安定版またはベータ版のホスト イメージの選択](/ja/codespaces/setting-your-user-preferences/choosing-the-stable-or-beta-host-image)」をご覧ください。 ホスト イメージは、VM に使用される Linux のバージョンを定義します。 VM はユーザーに対して専用および個人用です。 専用の VM を使用すると、そのマシンから使用できるコンピューティング リソースのセット全体を確保できます。 必要に応じて、これにより、コンテナーへの完全なルート アクセス権を取得することもできます。\n\nリポジトリの (または、テンプレートから codespace を作成する場合はテンプレート リポジトリの) [シャロー クローン](https://github.blog/2020-12-21-get-up-to-speed-with-partial-clone-and-shallow-clone/)が作成されます。 これは VM の `/workspaces` のディレクトリに複製され、その後開発コンテナーにマウントされます。 詳しくは、後の「[codespace のディレクトリ構造について](#about-the-directory-structure-of-a-codespace)」をご覧ください。\n\n### 手順 2: 開発コンテナーを作成する\n\nGitHub Codespaces では、開発環境として Docker コンテナーが使用されます。 このコンテナーは、`devcontainer.json` ファイルおよび必要に応じて Dockerfile で定義できる構成に基づいて作成されます。 GitHub の空のテンプレートから、または `devcontainer.json` ファイルのないリポジトリから codespace を作成する場合、GitHub Codespaces で既定のイメージが使用されます。これには、使用可能な言語とランタイムが多数あります。 詳しくは、「[開発コンテナーの概要](/ja/codespaces/setting-up-your-project-for-codespaces/adding-a-dev-container-configuration/introduction-to-dev-containers)」をご覧ください。 既定の開発コンテナーのイメージの内容について詳しくは、[`devcontainers/images`](https://github.com/devcontainers/images/tree/main/src/universal) リポジトリを参照してください。\n\n> \\[!NOTE]\n> codespace で Git フックを使用し、[git テンプレート ディレクトリ](https://git-scm.com/docs/git-init#_template_directory)内の何らかのものを codespace に適用する場合、コンテナーの作成後に手順 4 でフックを設定する必要があります。\n>\n> コンテナーの作成前にリポジトリがホスト VM に複製されるため、手順 4 の [](https://git-scm.com/docs/git-init#_template_directory)を使用して `devcontainer.json` 構成ファイルでフックを設定しない限り、`postCreateCommand`内のものは codespace に適用されません。 詳しくは、「[手順 4: 作成後のセットアップ](#step-4-post-creation-setup)」をご覧ください。\n\n### 手順 3: codespace に接続する\n\nコンテナーが作成され、その他の初期化が実行されると、codespace に接続されます。 次の方法で接続できます。\n\n* Web ブラウザー\n* [Visual Studio Code](/ja/codespaces/developing-in-a-codespace/using-github-codespaces-in-visual-studio-code)\n* [GitHub CLI](/ja/codespaces/developing-in-a-codespace/using-github-codespaces-with-github-cli)\n\n### 手順 4: 作成後のセットアップ\n\ncodespace に接続された後、`devcontainer.json` ファイルで指定した構成に基づいて、自動セットアップが引き続きビルドされる場合があります。\n`postCreateCommand`が表示され、`postAttachCommand` が実行される場合があります。\n\ncodespace で Git フックを使用する場合は、`devcontainer.json` などの `postCreateCommand` ライフサイクル スクリプトを使用してフックを設定します。 ライフサイクル スクリプトについて詳しくは、開発コンテナーの Web サイト上にある「[開発コンテナー仕様](https://containers.dev/implementors/json_reference/#lifecycle-scripts)」をご覧ください。\n\nGitHub Codespaces のパブリックのドットファイル リポジトリがある場合、それを新しい codespace で使用できるように有効にすることができます。 有効にすると、ドットファイルがコンテナーに複製され、インストール スクリプトが呼び出されます。 詳しくは、「[アカウントGitHub Codespaces のカスタマイズ](/ja/codespaces/setting-your-user-preferences/personalizing-github-codespaces-for-your-account#dotfiles)」をご覧ください。\n\n最後に、リポジトリから codespace を作成した場合、リポジトリの履歴全体が完全なクローンでコピーされます。 テンプレートから codespace を作成した場合、テンプレート リポジトリの完全な履歴は保持されません。代わりに、空白のテンプレートを使用するのでない限り、テンプレート リポジトリの内容に対する最初のコミットから始めます。\n\n作成後のセットアップ中も、統合ターミナルを使用してファイルを編集できますが、作業と実行中のコマンドの間の競合状態を回避するように注意してください。\n\n## Codespaces のライフサイクル\n\n### ファイルを codespace に保存する\n\n使用しているエディターに応じて、通常の方法でファイルに対する変更を保存します。\n\nVisual Studio Code の codespaces で作業する場合は、[自動保存](https://code.visualstudio.com/docs/editor/codebasics#_save-auto-save)を有効にして、変更が常に保存されるようにすることができます。\n\n### codespace の終了または停止\n\ncodespace は、使用している間は実行され続けますが、一定時間非アクティブになるとタイムアウトします。 エディターとターミナル出力からのファイルの変更はアクティビティとしてカウントされるため、ターミナル出力が継続されていれば codespace はタイムアウトしません。 既定の非アクティブ タイムアウト期間は 30 分です。 作成する codespace に対して個人用タイムアウト設定を定義できますが、これは組織のタイムアウト ポリシーによって却下される可能性があります。 詳しくは、「[GitHub Codespaces のタイムアウト期間の設定](/ja/codespaces/setting-your-user-preferences/setting-your-timeout-period-for-github-codespaces)」をご覧ください。\n\ncodespace がタイムアウトすると実行は停止しますが、ブラウザー タブから (ブラウザーで codespace を使用している場合)、VS Code 内から、または <https://github.com/codespaces> にある codespace の一覧から再起動できます。\n\n次の方法で codespace を停止できます。\n\n* ブラウザーで: <https://github.com/codespaces> にある codespace の一覧で、停止する codespace の右側にある省略記号 ( **...** ) をクリックし、 **\\[codespace の停止]** をクリックします。\n* VS Code で: the Visual Studio Code Command Palette を開きます。例えば、 <kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd> キー(Windows/Linux) または <kbd>Shift</kbd>+<kbd>Command</kbd>+<kbd>P</kbd> キー(Mac) - 「`Codespaces: stop`」と入力してから <kbd>Enter</kbd> キーを押します。 詳しくは、「[GitHub Codespaces で Visual Studio Code コマンド パレットを使用する](/ja/codespaces/reference/using-the-vs-code-command-palette-in-codespaces#suspending-or-stopping-a-codespace)」をご覧ください。\n* ターミナル ウィンドウで: GitHub CLI コマンド `gh codespace stop` を使用します。 詳しくは、「[GitHub CLI での GitHub Codespaces の使用](/ja/codespaces/developing-in-a-codespace/using-github-codespaces-with-github-cli#gh-commands-for-github-codespaces)」をご覧ください。\n\nstop コマンドを実行せずに codespace を終了した (たとえばブラウザー タブを閉じる) 場合、または操作なしで codespace を実行したままにした場合、codespace とその実行中のプロセスは、非アクティブ タイムアウト期間中は続行されます。\n\ncodespace を終了または停止すると、codespace に再度接続するまで、コミットされていない変更はすべて保持されます。\n\n## アプリケーションの実行\n\nポート転送を使用すると、Codespaces 内で実行されている TCP ポートにアクセスできます。 たとえば、codespace 内のポート 4000 で Web アプリケーションを実行している場合、そのポートを自動的に転送して、ブラウザーからアプリケーションをアクセスできるようにします。\n\nポートの転送は、リモート マシンからアクセス可能にするポートを決定します。 ポートを転送しない場合でも、そのポートには、codespace 自体内で実行されている他のプロセスにアクセスできます。\n\n![デバイス上のコード エディターまたはブラウザーとクラウド上の codespace の間のインターネット経由の接続を示す図。](/assets/images/help/codespaces/port-forwarding.png)\n\nGitHub Codespaces 内で実行されているアプリケーションでポートをコンソールに出力すると、GitHub Codespaces で localhost の URL パターンが検出され、ポートが自動的に転送されます。 ターミナルで URL をクリックするか、VS Code の右下隅にポップアップ表示される \"トースト\" 通知メッセージ内のリンクをクリックして、ブラウザーでポートを開くことができます。 GitHub Codespaces の既定では、HTTP を使用してポートが転送されます。 ポート転送について詳しくは、「[codespace でのポートの転送](/ja/codespaces/developing-in-a-codespace/forwarding-ports-in-your-codespace)」をご覧ください。\n\nポートは自動的に転送できますが、インターネットからパブリックにアクセスすることはできません。 既定では、すべてのポートはプライベートですが、手動で、組織またはパブリックでポートを使用できるようにして、URL を使用してアクセスを共有できます。 詳しくは、「[codespace でのポートの転送](/ja/codespaces/developing-in-a-codespace/forwarding-ports-in-your-codespace#sharing-a-port)」をご覧ください。\n\n初めて codespace に入ったときにアプリケーションを実行すると、高速の内部開発ループを実現できます。 編集すると、変更は自動的に保存され、転送されたポートで使用できるようになります。 変更を表示するには、ブラウザーで実行中のアプリケーションのタブに戻って更新します。\n\n## あなたの変更をコミットしてプッシュする\n\nGit は既定で codespace にインストールされるため、既存の Git ワークフローに依存できます。 codespace で Git を操作するには、ターミナルを使うか、VS Code のソース管理機能を使います。\n\n既存のリポジトリで作業している場合は、リポジトリ内のブランチ、コミット、または pull request から codespace を作成することも、アクティブな codespace 内から新しいまたは既存のブランチに切り替えることもできます。 GitHub Codespaces はエフェメラルになるように設計されているため、分離された環境として使用して、実験、チームメイトの pull request の確認、またはマージ競合の修正を行うことができます。\n\nリポジトリへの読み取りアクセス権しかない場合、フォークできる間はリポジトリの codespace を作成できます。 codespace からコミットするか、新しいブランチをプッシュすると、GitHub Codespaces によってリポジトリのフォークが自動的に作成されるか、それともアップストリーム リポジトリ用のフォークが既にある場合は codespace が既存のフォークにリンクされます。\n\nテンプレートから作成された codespace で作業している場合、Git は既定でインストールされますが、作業を永続化し、他のユーザーと共有するには、codespace をリモート リポジトリに発行する必要があります。 GitHub の空のテンプレートから開始する場合は、codespace 内でソース管理の使用を開始するには、まずワークスペースを Git リポジトリとして初期化 (たとえば「`git init`」と入力) する必要があります。\n\n詳しくは、「[Codespace でソースコントロールを使用する](/ja/codespaces/developing-in-a-codespace/using-source-control-in-your-codespace)」をご覧ください。\n\n> \\[!NOTE]\n> codespace からのコミットは、<https://github.com/settings/profile> で構成した名前と公開メール アドレスに属性付けられます。\n> `GITHUB_TOKEN`として環境に含まれるリポジトリにスコープが設定されたトークンと、GitHub資格情報が認証に使用されます。\n\n## 拡張機能を使用して codespace をカスタマイズする\n\ncodespace 内に拡張機能を追加して、VS Code のエクスペリエンスをカスタマイズできます。\n\n### VS Code 拡張機能\n\nVS Code デスクトップ アプリケーションまたは Web クライアントの codespaces で作業している場合は、Visual Studio Code Marketplace から必要な拡張機能を追加できます。 拡張機能が GitHub Codespaces でどのように実行されるかについては、GitHub Codespaces ドキュメントの「[リモート開発と VS Code のサポート](https://code.visualstudio.com/api/advanced-topics/remote-extensions)」を参照してください。\n\n既に VS Code を使っている場合は、[\\[設定の同期\\]](https://code.visualstudio.com/docs/editor/settings-sync) を使って、ローカル インスタンスと作成した codespace との間で拡張機能、設定、テーマ、キーボード ショートカットを自動的に同期できます。\n\n## codespace のディレクトリ構造について\n\ncodespace を作成すると、リポジトリが codespace 内の `/workspaces` ディレクトリに複製されます。 これは、コンテナーにマウントされる永続的なディレクトリです。 ファイルの編集、追加、削除など、このディレクトリ内で行った変更は、codespace を停止して開始するとき、および codespace 内のコンテナーをリビルドするときに保持されます。\n\n`/workspaces` ディレクトリの外部では、codespace のビルドに使用される開発コンテナー イメージによって異なる Linux ディレクトリ構造が codespace に含まれています。 `/workspaces` ディレクトリ外部で、ファイルを追加したりファイルに変更を加えたりすることができます。 たとえば、新しいプログラムをインストールしたり、`~/.bashrc` のようなファイルにシェル構成を設定したりすることができます。 ルート以外のユーザーは、特定のディレクトリへの書き込みアクセス権を自動的に持っていない場合がありますが、ほとんどのイメージでは、これらのディレクトリへの `sudo` コマンドを使ったルート アクセスが許可されます。\n\n`/workspaces` の外部では、`/tmp` ディレクトリを除き、codespace 内のディレクトリはコンテナーのライフサイクルに関連付けられます。 つまり、codespace を停止して開始した場合、加えた変更は保持されますが、コンテナーをリビルドした場合は保持されません。`/tmp` ディレクトリについて詳しくは、「[環境変数と一時ファイルを永続化する](/ja/codespaces/developing-in-a-codespace/persisting-environment-variables-and-temporary-files#preventing-temporary-files-from-being-automatically-deleted)」をご覧ください。\n\n`/workspaces` の外側にあるディレクトリをクリアすると、再構築されたコンテナーを新しく作成された codespace での状態と同じようにすることができます。 作業している codespace に構成変更を適用するためにコンテナーを再構築している場合は、同じ構成で新しい codespace を作成しているユーザーに対して構成変更が同じように機能していると確信できます。 詳しくは、「[開発コンテナーの概要](/ja/codespaces/setting-up-your-project-for-codespaces/adding-a-dev-container-configuration/introduction-to-dev-containers)」をご覧ください。\n\nリビルドや異なる codespace 間でより堅牢になる codespace に対して変更を加える場合は、いくつかのオプションがあります。\n\n* リポジトリから作成されたすべての codespace にプログラムやツールをインストールするには、開発コンテナー構成で、`postCreateCommand` などのライフサイクル コマンド プロパティを使ってカスタム インストール コマンドを実行するか、事前に作成された \"features\" というインストール コマンドから選択できます。 詳しくは、[開発コンテナーの仕様](https://containers.dev/implementors/json_reference/#lifecycle-scripts) (開発コンテナーの Web サイト) と、「[devcontainer.json ファイルへの機能の追加](/ja/codespaces/setting-up-your-project-for-codespaces/configuring-dev-containers/adding-features-to-a-devcontainer-file)」をご覧ください。\n* ツールをインストールしたり、`bash` プロファイルの構成など、作成したすべての codespace でセットアップをカスタマイズするには、GitHub Codespaces を dotfiles リポジトリにリンクします。 また、dotfiles リポジトリは、永続的な `/workspaces` ディレクトリに複製されます。 詳しくは、「[アカウントGitHub Codespaces のカスタマイズ](/ja/codespaces/setting-your-user-preferences/personalizing-github-codespaces-for-your-account#dotfiles)」をご覧ください。\n* リビルドで特定のファイルを保持する場合は、このファイルと `devcontainer.json` 内の永続的なディレクトリとの間で `/workspaces` ファイルを使ってシンボリック リンクを作成できます。 詳しくは、「[codespace でのコンテナーのリビルド](/ja/codespaces/developing-in-a-codespace/rebuilding-the-container-in-a-codespace#persisting-data-over-a-rebuild)」をご覧ください。\n\n## 参考資料\n\n* [組織の GitHub Codespaces の有効化または無効化](/ja/codespaces/managing-codespaces-for-your-organization/enabling-or-disabling-github-codespaces-for-your-organization)\n* [組織内の GitHub Codespaces のコストの管理](/ja/codespaces/managing-codespaces-for-your-organization/managing-the-cost-of-github-codespaces-in-your-organization)\n* [開発コンテナー構成のリポジトリへの追加](/ja/codespaces/setting-up-your-project-for-codespaces/adding-a-dev-container-configuration)\n* [codespace ライフサイクルについて](/ja/codespaces/about-codespaces/understanding-the-codespace-lifecycle)"}