2020年1月4日土曜日

UbuntuでPlatformIOが更新できないときの対応方法


背景

PlatformIOとは、Arduinoなどの組み込み機器のプログラムを開発できる環境です。
UbuntuでPlatformIOを更新しようとしても出来ない事態に遭遇したので、備忘録を兼ねて対応内容を共有します。

使ったもの

PlatformIOをインストールしたUbuntu

症状

下記のPlatformIOの更新コマンドでも。pipの更新コマンドでも、PlatformIOを更新できない状況になりました。
(コマンド実行後にOSを再起動しても更新できませんでした。)

PlatformIOの更新コマンド
platformio upgrade

pipでの更新コマンド
pip3 install --upgrade platformio

分かったこと

PlatformIOはインストール方法によって実行ファイルの配置先が変わることが分かりました。

下記のように管理者権限でインストールすると
sudo pip3 install platformio # 実行しないことをお勧めします
下記の実行可能ファイルが配置されます。
/usr/local/bin/pio
/usr/local/bin/piodebuggdb
/usr/local/bin/platformio

下記のように管理者権限無しでインストールするか
pip3 install platformio
管理者権限無しでアップグレードを行うか
pip3 install --upgrade platformio
PlatformIOのアップグレードコマンドを実行すると
platformio upgrade
下記の実行可能ファイルが配置または更新されます。
/home/asuki/.local/bin/pio
/home/asuki/.local/bin/piodebuggdb
/home/asuki/.local/bin/platformio


管理者権限無しでファイルを更新しても、管理者権限で配置した古いファイルが読み込まれていたことが今回の原因でした。

対応方法

自分の場合はこれらの条件が重なって更新できませんでした。
  • 「管理者権限で配置したファイル」が古いバージョンのままだった。
  • 実行ファイルを読み込みが/usr/local/binが先で/home/[ユーザー名]/.local/binが後だったので、管理者権限無しで更新しても設定が反映されない状況だった。
これは下記のどれかの方法で解決できます。

管理者権限でアンインストールして、インストールしなおす

管理者権限無しでインストールしたものと、管理者権限でインストールしたものを削除する必要があるため、アンインストールを2回実施した後にインストールを行います。
# 管理者権限無しでインストールしたファイルをアンインストール
pip3 uninstall platformio
# 管理者権限でインストールしたファイルをアンインストール
sudo pip3 uninstall platformio
# 管理者権限無しでインストール
pip3 install platformio

ファイルの読み込み順序を変更する

自分の場合は/usr/[ユーザー名]/.local/binを~/.bashrcで下記のように読み込ませていました。
export PATH=$PATH:$HOME/.local/bin

これだと
「ファイルを読み込み終えた後、まだ読み込んでいないファイルを~/.local/binから読み込む」
という記述になっているので、
「~/.local/binからファイルを読み込み、その後他のファイルを読み込む」
という下記の記述に変更することで、「platformio upgrade」コマンドなどで更新したファイルを読み込めます。
export PATH=$HOME/.local/bin:$PATH

しかしながら、この方法では/usr/local/binに使わないファイルが残ってしまうので、「管理者権限でアンインストールしてインストールしなおす」方法の方がお勧めです。

余談: 使ってないファイルの調査

使っていないplatformioのファイルが余分に配置されているかどうかは、下記のコマンドで確認できます。
for path in ${PATH//:/ }
do
  find $path -type f -iname platformio
done

使われないファイルが存在する場合は、複数のファイルを検出します。


検出するファイルが1つだけなら、期待通りに配置されています。


まとめ

「sudo pip3 install platformio」でインストールしたことが今回の不具合の原因でした。
PlatformIOの説明ページでも指示されるように「pip3 install platformio」もしくは「pip3 install -U platformio」コマンドでインストールするのが良さそうです。

0 件のコメント :

コメントを投稿