Nix は、これらのツールの 1 つであり、価値がないように見えますが、多額のエントリー プライスを支払う必要があります。 私は、再現可能なビルド (および NixOS の場合は宣言型ホスト管理) に非常に興味を持っているため、しばらくの間 Nix エコシステムに関する調査を行ってきました。 私が努力している現代の技術の多くのオブジェクトと同様に、私は
何人か 艦隊として努力を研究している多分また想像してみてください。 したがって、私は楽観的に説明に集まり、余分な努力を挿入することが最終的な価値のために正当化されるかどうかを反映できるようにします.
見てください、Nix の場合のこのスイート スペースは、一貫性のある 再現可能な パターンの雰囲気を構築しています。 当分の間、私が開始した現代のミッションでは、Nix を使用して固定して引き込みます:
私のセットアップは、Xe によるこの大規模な Weblog 投稿 は、Nix がセットアップに弱い可能性があることを示しています (および製造) 現代の Rust プロジェクト。 ここでの重要な違いの 1 つは、アーティファクトを製造するために Nix を使用していないことです 1
私はもう随分前に始めましたOCaml ショップでの最近の仕事なので、当然、ここでのイラストとしての OCaml の活用になります。 私はまた、他の言語のこのセットアップを効率的に弱めました2 Haskell、Java、Golang、Python を含む
NB
私はもう Nix を完全に理解しているとは主張しません。 私がここで実践している傾向は、間違いなく住居監督者の人々の眉をひそめるでしょう. それは確かに私にとってはうまくいきます、YMMV。 Nix がその意図をどのように、またはなぜ機能させるのかについて、私はもはや核心を突いた詳細な記録には立ち入らないでしょう。 私より知識が豊富な人は、extra で既に説明しました。 よりも あ 少ない オンラインでご案内します。
キットマネージャーである Nix のインストールが必要です。 手順は ここにあります 。 to to nix 以外にも niv nixpkgs
を固定する およびその他の Nix ソース
。 niv を Nix 経由でセットアップし、ユーザーの雰囲気、ダッシュ:
niv nixpkgs を特定するには: + bash+ ocamlPackages.ocaml+ ocamlPackages.dune_3+ ocamlPackages.findlib+ ocamlPackages.utop+ ocamlPackages.odoc+ ocamlPackages.ocaml-lsp+ ocamlformat+ ] まで適切です モデルと configure までの総意 そのキットを製造するために弱いフラグを立てます。 非常に注目を集める世界では、製造するたびに 123deadbeef-x-1.0
あなたのマシンのために、私は 123deadbeef-x-1.0 を製造しています。 私のマシンでは、これら 2 つのプログラムは完全に同一です。 本当の世界はごちゃごちゃしてるから、そっくりじゃないけど、結構終わってるNix は、プログラムとそのすべての依存関係を、ファイルシステムの分離されたセグメントである Nix ストアにインストールします。 これらのプログラムは、PATH または
LD_LIBRARY_PATH、彼らは一般的に快適さを妨げないように製造しています任意の意図であなたのシステム。 本当に、同じキットの多種多様なバリエーションがNixストアで平和に共存できます.
Nixpkgs は 6 か月ごとにメイン リリースを取得し、モデル内に反映されます (Nix はチャネルと呼んでいます): nixpkgs-22.11 は2022年11月にリリースされたものに変更されました。 nixpkgs-unstable は、頻繁に更新されますが、マウントされた就任スケジュールが好きではなく、通常は基本的に最もファッショナブルなプログラムのバリエーションが含まれています。 22.11 に相当する、安定した Nixpkgs チャネルは注目に値します。 、メーカーはリリース後にセキュリティパッチを収集します。
アソートチャンネルは番組のバリエーションが豊富です。 たとえば、
bash のモデル 22.11 は に固定されています5.1-p16、
21.05 は少し余分な日付がありました bash-5.1 -p4。 一方、nixpks-unstable は当面ブリーディングエッジ bash-5.2-p15 があります。 運動する機会が必要になります search.nixos.org は、最もファッショナブルな安定したチャンネル向けではありますが、これを想定しています。および nixpkgs-unstable。 場合によっては、安定したチャネルでキットを回収したり、不安定になったり、把握
ブランチ – 誰かが追加することもできます。 あるいは、あなたが理想的な発信者である可能性があり、あなたが望むもののNix派生を書き、そこからプル検索レコードデータを投稿します.
nivについて正しいこと チャネルを気にしないということです。 代わりに、niv initの時点で指定したチャネルの先端のコミットハッシュを記録します 実行。 これにより、Nix は常に同じモデルの Nixpkgs を実行し、どのチャネルを参照するかに関係なく 5。 ピン留めされたコミット ハッシュを最もファッショナブルなヒントに変更したり、ピン留めする可能性が最も高いチャネルを変更したりする可能性があることを示します )niv 変更 nixpkgs -b
. )まあまあ、私たちの使命を設定するために手を貸しましょう。 私も追加することができます nixfiles を Nix のソースにするので、参照できるようにします私のお気に入りのパターン ツールのカスタム セットアップの Nix 式:
└─ ─ sources.nix 2 ディレクトリ、2 レコードデータ に事実の申し出を保持します には、すべての Nix ソースのコミット ハッシュと SHA-256 チェックサムが含まれています。 sources.nix は、脆弱な Nix 式です。 niv を介して固定された Nix ソースで指定された Nix 派生を参照します。 .
+ bash+ ocamlPackages.ocaml+ ocamlPackages.dune_3+ ocamlPackages.findlib+ ocamlPackages.utop+ ocamlPackages.odoc+ ocamlPackages.ocaml-lsp+ ocamlformat+ ] nixfiles. これらは両方ともすでに固定されていると考えてください。 次に、ビルドする nixfiles から Nix 特性を呼び出します。私のパーソナライズされた Neovim 派生.
さて、最前部のセグメント: I invoke pkgs.mkShell パターンシェルを設定する特性。 この特性は nixpkgs で定義されています。 この特徴に対して 2 つの引数を提示します: shellHooks はnix-shell の実行時に評価されるシェル式、およびbuildInputs は、Nix が現在平和的に使用する可能性のあるすべてのプログラムを一覧表示します。私たちのパターンシェルで。 手始めに、実際には bash が必要です。 上記で定義したカスタム neovim を後で追加します。
走って頑張ろう nix-shell --pure:
/nix/store/026hln0aq1hyshaxsdvhg0kmcm6yf45r-zlib-1.2.13 /nix/store/039g378vc3pc3dvi9dzdlrd0i4q93qwf-binutils-2.39[- pkgs.bash- neovim- ] /nix/store/1d6ian3r8kdzspw8hacjhl3xkp40g1lj-binutils-wrapper-2.39 /nix/store/1dgws25664p544znpc6f1nh9xmjf4ykc-pcre-8.45 /nix/store/1gf2flfqnpqbr1b4p4qz2f72y42bs56r -gcc-11.3.0 (...簡潔にするために省略...) コース「/nix/store/i38jcxrwa4fxk2b7acxircpi399kyixw-linux-headers-6.0」を「https://cache」からコピーしています.nixos.org'... コース「/nix/store/5mh5019jigj0k14rdnjam1xwk5avn1id-libidn2-2.3.2」を「https」からコピー://cache.nixos.org'...「https://cache.nixos. org'... コース「/nix/store/cr5fmwri3601s7724ayjvckhsg6cz4rv-attr-2.5.1」を「https://」からコピーcache.nixos.org'... 「https:/ /cache.nixos.org'... /nix/store/38db4p333ibll7r1v151yc5f6ms1fr00-bash-インタラクティブ-5.2-p15/bin /nix/store/mydc6f4k2z73xlcz7ilif3v2lcaiqvza-findutils-4.9.0/bin[- pkgs.bash- neovim- ] /nix/store/ j9p3g8472iijd50vhdprx0nmk2fqn5gv-diffutils-3.8/bin /nix/store/86bp03jkmsl6f92w0yzg4s59g5mhxwmy-gnugrep-3.7/bin
/nix/store/hwcdqw4jrjnd37wxqgsd47hd0j8bnj09-survey-5.1.1/bin[+ bash+ ocamlPackages.ocaml+ ocamlPackages.dune_3+ ocamlPackages.findlib+ ocamlPackages.utop+ ocamlPackages.odoc+ ocamlPackages.ocaml-lsp+ ocamlformat+ ] /nix/store/cfbhw8r8ags41vwqaz47r583d0p4h4a1-gnutar-1.34/bin
/nix/store/p3m1ndl1lapwrlh698bnb5lvvxh67378-gzip-1.12/置き場 /nix/store/ a8mhcagrsly7c7mpjrpsnaahk4aax056-bzip2-1.0.8-bin/bin+ bash+ ocamlPackages.ocaml+ ocamlPackages.dune_3+ ocamlPackages.findlib+ ocamlPackages.utop+ ocamlPackages.odoc+ ocamlPackages.ocaml-lsp+ ocamlformat+ ] に追加するのと同じくらい簡単です。 buildInputs)。 nix-shell --pure を再度実行すると余分にプルされますプログラムを作成し、自分のパーソナライズされた nvim が気に入ったシェルにドロップします。 利用可能:
ギット 専念 -m [nix-shell:/home/dimitrije/git/repo]$ エコー $PATH | tr ':' 'n' (...簡潔にするために省略...) コース「/nix/store/38db4p333ill7r1v151yc5f6ms1fr00-bash-interactive-5.2-p15」を「https://cache.nixos.org」からコピーしています... コピーコース '/nix/ store/34xlpp3j3vy7ksn09zh44f1c04w77khf-libunistring-1.0 'https://cache.nixos.org' から...
これらの 38 パスが取得されます (66.44 MiB のダウンロード、303.90 MiB のアンパック): さて、いくつかの OCaml 固有のプログラムを追加しましょう:
├── sources.json まず、主要な ocaml が必要です ネイティブ OCaml コンパイラを組み込んだキット ocamlopt
とバイトコード OCaml コンパイラ ocamlc 、その他。 砂丘 私の製造ツールとして。 Dune は、物を製造したり、ミッション ディレクトリの開発をセットアップしたり、ダッシュ チェックを行ったり、ドキュメントを生成したりできます findlib は、砂丘ができるようにするために必須ですNix shell 環境でライブラリを検索します。 ocaml には、同名の高レベル (REPL) バイナリが既に含まれていますが、utop は、この新しい日に非常に広く普及しており、調査ではより簡単です. odoc
は、Dune で効果的に機能するドキュメント ジェネレーターです。 運動します ocamlfo rmat で OCaml ソースを自動フォーマットします。 最後に、OCaml の LSP 実装が必要です ocaml-lsp
、Neovim LSP を使ったスイーツのエクササイズを開発できるようになります。
--- a /shell.nix +++ b/shell.nix
} 私は弱いwith キー フレーズを使用して、繰り返しを少し減らします。 あなたがおそらく調査するかもしれないように、一般的に、プログラムは nixpkgs では新しいものではなくなります。 ルートですが、ネストされています。 私は一般的に運動します search.nixos.org を使用して、特定のキットの発現を検索する場所を特定します。 それでも結果が得られない場合は、 nix-env -qaP の出力を grep してみてください。 場合によっては、nixpkgs のネイティブ クローンを取得する必要さえありました。 ) および grep ソース。 もはやあまり注目を集めていませんが、私は知っています ¯_(ツ)_/¯.
次に作成しなければならないのは、承認済みの OCaml ミッション ディレクトリ開発を dune (私のパターンシェルから):
)
これは、次のレイアウト内でも発生する可能性があります: