devenvの
背景
- devenv (+ direnv連携)で
プロジェクトの 実行環境などを 管理している - devenv scriptsの
実行ファイルと して、 特定の 言語ランタイムで 実行する ファイルを 指定したい - 例: uv (Python)
- かつ、
スクリプト内部で コマンドライン引数の 解析なども 実施したい
方法
TL;DR -> devenv.nix でawesome-script と
scripts.*.package: 実行に必要な Nixパッケージ - 複数あれば
scripts.*.packagesに配列で 記載する
- 複数あれば
scripts.*.exec: 実行したいスクリプトへの パス (文字列ではなく、 相対パスを そのまま ) scripts.*.binary:uv runなどスクリプトを 渡すコマンド名(文字列)
devenv.nix
{ pkgs, lib, config, inputs, ... }: {
# ... env/languagesなど
scripts.awesome-script = {
exec = ./scripts/awesome-script/main.py;
binary = "uv run";
package = pkgs.uv;
};
}例: scripts/awesome-script/main.py
#!/usr/bin/env -S uv run --script
# /// script
# requires-python = ">=3.13"
# dependencies = [
# "typer",
# ]
# ///
import sys
import typer
app = typer.Typer()
@app.command()
def main():
print(f"Hello: {sys.argv=}")
if __name__ == "__main__":
app()