PlatformIOで.envを使えるライブラリを作った

背景

以前の記事を書いていて、 試しにライブラリを作ってみたくなったので簡単なものを作ってみました。

成果物

成果物はPioDotEnvというライブラリです。 普段はWebシステムの開発をしているので、 .env によって環境毎の設定を書くことが多いのですが、 Arduino IDEやPlatformIOではその辺の機能がないのでライブラリにしてみました。 正直、 platformio.ini に書いてignoreしてしまえばいいのですが…… 今回は練習も兼ねて作ってみました。

インストール方法

PlatformIOのレジストリに登録しているので、 platformio.inilib_deps に以下のように記述すればインストールできます。

lib_deps =
    enkatsu/PioDotEnv@^0.0.2

使い方

使い方は、プロジェクトルートに .env ファイルを用意して、 環境固有の定数を記述します。

WIFI_SSID=YOUR_WIFI_SSID_SSID
WIFI_PASS=YOUR_WIFI_PASS

あとは、以下のようにソースコードの使いたい箇所で定数を呼び出すだけです。 また PioDotEnv.h では #define で定義した文字列をソースコード中に文字列として展開するマクロ関数 DEF_TO_STR() を用意してあります。 Wi-FiのSSIDやパスワードなどの文字列を扱いたい場合はインクルードして使えます。

#include <Arduino.h>
#include <WiFi.h>
#include <PioDotEnv.h>

void setup() {
    WiFi.begin(DEF_TO_STR(WIFI_SSID), DEF_TO_STR(WIFI_PASS));
}

void loop() {
}

実装

実装はシンプルです。

include/PioDotEnv.h では、先ほど紹介したマクロ関数の定義のみです。 この機能はこちらの記事 を参考にしました。

#define TO_STR(x) #x
#define DEF_TO_STR(x) TO_STR(x)

.env を読み込んで #define する機能は、 extraScript で実行される extra_script.py に持たせてあります。

{
    "name": "PioDotEnv",
    "version": "0.0.1",
    "build": {
        "extraScript": "extra_script.py"
    }
}
import os
Import('env')

env_file_path = os.path.join(env['PROJECT_DIR'], '.env')

if os.path.isfile(env_file_path):
    with open(env_file_path) as f:
        for line in f:
            if line.startswith('#') or not line.strip():
                continue
            
            key, value = line.strip().split('=', 1)
            env.Append(CPPDEFINES=[(key, value)])

レジストリに登録する

PlatformIOのレジストリに登録する手順は、 ほとんどこちらの記事を 参考にしました。

pio コマンドですが、 自分はVSCodeのPlatformIO拡張を使っているので、 PlatformIO拡張内の pio コマンド ( /Users/${YOUR_USER_NAME}/.platformio/penv/bin/pio )のシンボリックリンクを /usr/local/bin に作成することで使用できるようにしました。

# 以下のコマンドでシンボリックリンクを作成(${YOUR_USER_NAME}は自分のユーザ名に置き換えてください)
sudo ln -s /Users/${YOUR_USER_NAME}/.platformio/penv/bin/pio /usr/local/bin/
# シンボリックリンクが作成されていることを確認
ls -al /usr/local/bin | grep pio

# 以下のコマンドでユーザ情報を入力してアカウントを作成
pio account register
# 以下のコマンドでCLIからログイン
pio account login
# 以下のコマンドでレジストリにパブリッシュ
pio package publish $PWD/PioDotEnv

まとめ

とりあえず作ってみた感じですが、 そのうちGitHub ActionsからPlatformIOレジストリへの更新もしたいと思います。


PlatformIOで.envを使えるライブラリを作った

By Katsuya Endoh, 2025-03-16