機能

ccamのアップデート

最終更新日: 2026年10月19日
ccam 0.6.0とClaude Code 2.1.302で確認済み

このページは英語から機械翻訳されています。修正を歓迎します。 GitHubでこのページを編集

このページの内容

ccam updateは、GitHubからccamのリリースをダウンロードし、リリースのchecksums.txtで検証してから、実行中のバイナリを1回のrenameで置き換えます。インストールスクリプトやアーカイブからccamをインストールした場合に使います。ccamが自分から更新を確認することはありません。GitHubに接続するのはこのコマンドだけなので、ほかのコマンドはすべてオフラインでも同じように動作します。

使い方

ccam update                    # install the latest release
ccam update --check            # only say whether a newer release exists
ccam update --version v0.3.0   # install that release, also an older one
ccam --dry-run update          # show what would be downloaded and replaced
$ ccam update --check
ccam 0.5.0 is available (you have 0.4.0). Run `ccam update`.
$ ccam --dry-run update
Would update ccam 0.4.0 → 0.5.0:
  download  https://github.com/jhyunwoo/ccam/releases/download/v0.5.0/ccam_linux_amd64.tar.gz
  verify    with https://github.com/jhyunwoo/ccam/releases/download/v0.5.0/checksums.txt
  replace   /home/you/.local/bin/ccam
$ ccam update
→ downloading https://github.com/jhyunwoo/ccam/releases/download/v0.5.0/ccam_linux_amd64.tar.gz
✓ Updated ccam 0.4.0 → 0.5.0 (/home/you/.local/bin/ccam)

新しいリリースがない場合、ccamはccam 0.4.0 is up to date.と表示し、何も変更しません。--versionに実行中のバージョンを指定した場合は、ccam 0.4.0 is already installed.と表示します。

オプション

オプション 効果 デフォルト
--check 新しいリリースがあるかどうかを報告するだけです オフ
--version <tag> v0.3.0のようなリリースタグをインストールします。現在のものより新しくても古くてもかまいません 最新
--dry-run 対応しています。最新のタグを調べ(--versionで指定した場合を除く)、バイナリに対して同じ確認を行い、ダウンロードせずに、ダウンロード、チェックサム、置き換えのパスを表示します オフ

--checkと--versionは同時に使えません。タグはvMAJOR.MINOR.PATCHの形式で、プレリリースやビルドの接尾辞を付けてもかまいません。先頭のvは省略できます。それ以外は失敗します。たとえば--version takes a release tag such as v0.3.0, not "1.2"のようになります。

環境変数CCAM_RELEASES_URLは、ミラーやテストのためにhttps://github.com/jhyunwoo/ccam/releasesを置き換えます。構成は同じでなければなりません。<url>/latestが<url>/tag/<tag>にリダイレクトし、アセットは<url>/download/<tag>/<asset>にある必要があります。

しくみ

コードはinternal/updateにあり、これをインポートするのはccam updateだけです。起動経路から呼び出されることはありません。

  1. cli.updateCmdがos.Executableで実行中のバイナリを見つけ、filepath.EvalSymlinksでシンボリックリンクを解決します。置き換えられるのは、この実際のパスです。
  2. --versionがない場合、Updater.Latestはリダイレクトをたどらずに<releases>/latestにリクエストを送り、Locationヘッダー(…/tag/v0.5.0)からタグを読み取ります。GitHub APIではなくリリースのページを使うので、APIの1時間あたり60リクエストの制限は適用されません。この問い合わせの制限時間は10秒です。
  3. parseVersionがタグを厳密なパターンで確認します。タグはダウンロードURLや表示されるシェルコマンドに入るため、/、%、空白、シェルの特殊文字を含むものは通しません。compareVersionsが実行中のバージョンと比較します。プレリリースは、そのリリースより前として扱われます。
  4. managed()とwritable()が、そもそもccamがバイナリを置き換えてよいかを判断します(後述)。
  5. Updater.Fetchがccam_<os>_<arch>.tar.gzとchecksums.txtを同時にダウンロードします。制限時間は両方合わせて2分です。各ダウンロードの上限は256 MBです。
  6. ほかの処理を行う前に、アーカイブのSHA-256がchecksums.txtの該当行と一致する必要があります。行がない場合やチェックサムが異なる場合は、nothing was changedで更新を停止します。
  7. extract()がtarを読み、ccamという名前の最初の通常ファイルを取り出します。ディレクトリ、リンク、その他の項目は無視し、バイナリにも256 MBの上限があります。
  8. Updater.Installがfsutil.AtomicWriteで新しいバイナリを書き込みます。バイナリの隣に、古いファイルと同じ権限ビットで一時ファイル.ccam.tmp*を作り、ディスクにフラッシュしてから、古いファイルの上にrenameします。

タグの問い合わせからrenameまでの全体の流れは次のとおりです。

アーカイブとchecksums.txtは並行してダウンロードされ、チェックサムが一致するまで何も書き込まれません。renameはアトミックなので、クラッシュやディスクの容量不足が起きても、残るのは古いバイナリか新しいバイナリのどちらかで、中途半端なものが残ることはありません。~/.local/bin/ccworkのようなショートカットコマンドはccamのバイナリへのシンボリックリンクなので、何も変更しなくても新しいバージョンが実行されます。

パッケージでインストールした場合

.debからインストールしたccamはaptの管理下にあり、aptを通さずに置き換えるとパッケージのデータベースが不正確になります。ダウンロードする前に、ccamはバイナリの所有者を確認します。

  1. /usr/bin、/bin、/usr/sbin、/sbinにあるバイナリは、パッケージで管理されているとみなします。
  2. それ以外の場所でも、dpkgがインストールされていてdpkg -S <path>が成功すれば、パッケージで管理されているとみなします。
  3. それ以外の場合、ccamはバイナリの隣に一時ファイル.ccam-update-*を作成して削除し、そこに書き込めることを確認します。

パッケージで管理されているバイナリの場合、ccamは停止し、aptでの手順を表示します。

$ ccam update
ccam: /usr/bin/ccam was installed by a package, so `ccam update` leaves it alone.
To update the .deb, download ccam_0.5.0_linux_amd64.deb from https://github.com/jhyunwoo/ccam/releases/tag/v0.5.0 and run:
  sudo apt install ./ccam_0.5.0_linux_amd64.deb
Or install a copy in ~/.local/bin with the install script:
  curl -fsSL https://raw.githubusercontent.com/jhyunwoo/ccam/main/install.sh | sh

Linux以外のシステムでは、インストールスクリプトの行だけが表示されます。フォルダーに書き込めない場合、ccamはインストールスクリプトをもう一度実行するよう提案します。インストールスクリプトはccamを~/.local/binにインストールします。

安全性と特殊なケース

  • 開発版のビルドはバージョンをdevと報告し、比較するリリースがないので、ccam updateとccam update --checkは拒否します。ccam update --version vX.Y.Zなら、その上にリリースをインストールできます。
  • ダウンロードの失敗、使っているプラットフォーム用のアセットがない場合、チェックサムの不一致では、インストール済みのバイナリはそのまま残ります。
  • 存在しないリリースはthere is no release <tag>で失敗します。GitHubがHTTP 403や429で拒否した場合、ccamはレート制限の可能性が高いことを伝え、しばらくしてから再試行するよう求めます。
  • --checkは読み取るだけです。バイナリがパッケージで管理されているか、書き込めるかは確認しません。
  • 以前のバージョンに戻すには、--versionに古いタグを指定します。