背景
以前の記事を書いていて、 試しにライブラリを作ってみたくなったので簡単なものを作ってみました。
成果物
成果物はPioDotEnvというライブラリです。
普段はWebシステムの開発をしているので、
.env
によって環境毎の設定を書くことが多いのですが、
Arduino IDEやPlatformIOではその辺の機能がないのでライブラリにしてみました。
正直、 platformio.ini
に書いてignoreしてしまえばいいのですが……
今回は練習も兼ねて作ってみました。
インストール方法
PlatformIOのレジストリに登録しているので、
platformio.ini
の lib_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レジストリへの更新もしたいと思います。