node2nix
Deploying a Node.js development project $ npm iの代わりに$ node2nixを実行する
package.jsonを見て依存関係の諸々を揃える
package.jsonからNix式を生成する
node-packages.nix
全ての依存関係を含むdeploy可能なpackageのcapturing
内容は必要なpackageの依存関係を全て列挙している
node-env.nix
buildに使うscriptが書かれている
量は多いが毎回同じ定型のものが出力されているんじゃないかな?
600行ぐらい
default.nix
上2つを動かしてdeployする
この3つのfileがある状態で$ nix-build -A packageするとbuildできる
もしそのnpm packageの依存関係にJS以外の言語で書かれたものが入っていたとしてもNixが統一的に管理してくれる
Generating a tarball from a Node.js development project
$ node2nixで生成された3つのファイルがあれば$ nix-build経由でtarballを生成できる
Deploying a development environment of a Node.js development project
nix-shellで環境を作る
あー、node2nixで作ったやつを元に、nix-shell環境を作るのか
やりかたがよくないのかうまくいかないmrsekut.icon
Using the Node.js environment in other Nix derivations
Deploying a collection of NPM packages from the NPM registry
package.jsonを書かずにzenn-cliを使っている
Using NPM lock files
Generating packages for specific Node.js versions
手順
$ nix-shell -p nodePackages.node2nix
この書き方だと上手く行かないmrsekut.icon
普通のpackage.jsonみたいな書き方で、ts-nodeとtypescriptを指定する
dependenciesに書く感じmrsekut.icon
devDependeciesではなくdependenciesに書く
code:package.json
{
"name": "javascript",
"version": "1.0.0",
"dependencies": {
"ts-node": "^10.4.0",
"typescript": "^4.5.4"
}
}
配列で["ts-node", "typescript"]とすると独立なものとして扱われるっぽい?
$ node2nix
$ nix-build
これで終わりmrsekut.icon
これで使える
$ ./result/bin/ts-node
home-managerでnodePackagesになかったら、node2nixで自分で作って、参照すればよいよというやつ
これ、結局npmの代替として使うのか?
ts-のでみたいにコマンド感覚で使うやつを、home-managerで入れる、みたいな使い方の嬉しさはわかるmrsekut.icon
projectを作る際にnpmの代替として使うのはどのぐらい嬉しいのかよくわからない
node-package.nixのイメージ
package.jsonで指定したものはinの中で列挙される
以下ではlodashのみ指定している
letの中では↑これらが依存するpackageが大量に列挙される
ここの量がめっちゃおおいmrsekut.icon
その際にversionなどもちゃんと固定されている
code:node-package.nix
{nodeEnv, fetchurl, fetchgit, nix-gitignore, stdenv, lib, globalBuildInputs ? []}:
let
sources = {
"@babel/runtime-7.16.3" = {
name = "_at_babel_slash_runtime";
packageName = "@babel/runtime";
version = "7.16.3";
src = fetchurl {
sha512 = "WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==";
};
};
"@steelydylan/markdown-it-imsize-1.0.2" = {..}
...
};
in
{
lodash = nodeEnv.buildNodePackage {
name = "lodash";
packageName = "lodash";
version = "4.17.21";
src = fetchurl {
sha512 = "v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==";
};
buildInputs = globalBuildInputs;
meta = {
description = "Lodash modular utilities.";
license = "MIT";
};
production = true;
bypassCache = true;
reconstructLock = true;
};
}