事前にビルドされたバイナリをダウンロードする代わりに、Nixがローカルにビルドして「パッケージをインストール」するようにするにはどうすればよいですか?

事前にビルドされたバイナリをダウンロードする代わりに、Nixがローカルにビルドして「パッケージをインストール」するようにするにはどうすればよいですか?

合格」インストールパッケージ「私の言葉は、Nixビルド式(などを使用して)を評価することが、使用するのではなくソースコードからビルドされるということですnix-envnix-shell -p変える

最初はStackoverflowに投稿しかし、[Charles Duffyは] [3]コマンドラインツールや設定に関するものであれば、ここがより適切であると指摘します。それでもそのままにしておきます。 Nix言語自体を使用すると、パッケージが常にソースでコンパイルされるように強制できると仮定するため、まだ方法はわかりません。 (または実際には可能ではありませんが、誰かが指摘している場合は、質問はここにあります。)

答え1

どちらにしても設定substituteオプションfalse~へnix.conf(デフォルトtrue)または--option substitute falseNixコマンドを呼び出すときに使用されます。

nix-env --options substitute false -i hello

nix-shell --options substitute false -p hello

あなたが探しているロボットではないかもしれません。

ロバートヘンシング(コメントチャット)、ヘンリー・メンケ(コメント)とウラジミールチュヌート(コメント)はこれが実際に望むものではないかもしれないことを指摘しています。

詳しく説明すると、私はいつも最も基本的なNix機能の使用に自信を持っていましたが、Cで書かれた大規模アプリケーションのカスタムフォークを維持してデプロイする必要があるポイントに到達することは最初は非常に恐れていました。

最も簡単な方法で問題を解決してください。インポート私はそれをフォークして新しいソースコードで再構築したので、この問題が原因だと思いました。しかし、私にとって正しい方向は次のとおりです。Nixpkgs/パッケージの作成とデバッグ内部にNixOS Wiki

パッケージ自体のみを再構築してください。

ウラジミールクナートコメントそれ」回避策を無効にすると、ローカルで見つからないすべてのアイテムを再構築できます。しかし、このような質問をする人は通常、指定されたパッケージ自体だけを再構築したいようです。

(これは次のように達成できます。nix-buildあるいは、「ただ」は元のパッケージを上書きしますが、間違っている可能性があります。後者はNixOS Wikiの記事で言及されています。開発環境課nix-shellしかし、私はまだそれを完全に理解していません。 )

テストの再現性

後者のビルドが決定的であることを確認したい場合は、同じ質問をすることができます。 〜のようにヘンリー・メンケのコメントnix-build --check、この目的に使用する必要があります。

この--checkオプションは見逃しやすいです。man nix-buildまたはnix-build内部にニックスマニュアルしかし、なぜならnix-store --realize(例えばman nix-build説明する):

nix-buildnix-instantiate本質的に(高レベルNix表現を低レベルリポジトリ派生に変換)と(ストレージデリバティブ構築)を取り巻くラッパーですnix-store --realise。したがって、ここにリストされていないすべてのオプションは、および/をnix-store --realise除いてに渡されます。--arg--attr-Anix-instantiate

詳細な例については、以下をご覧ください。ニックスマニュアル存在する18.1 確実性を高めるための即時点検そして次の部分は次のとおりです


構成オプションの関連部分はsubstitute次のとおりです。このnix.conf部分~からニックスマニュアル:

名前

nix.conf— Nix 構成ファイル

説明する

Nixは2つの設定ファイルから設定を読み込みます。

  • システム全体の設定ファイルsysconfdir/nix/nix.conf/etc/nix/nix.confほとんどのシステムなど)、またはすでに設定されている$NIX_CONF_DIR/nix.conf場合。NIX_CONF_DIR

  • ユーザープロファイル$XDG_CONFIG_HOME/nix/nix.confまたは設定されていない~/.config/nix/nix.conf場合XDG_CONFIG_HOME

--optionフラグを使用してコマンドラインで設定を上書きできます。、例えば--option keep-outputs false

現在、次の設定が利用可能です。

[..]

変える
true(デフォルト)に設定すると、Nixは可能であればバイナリ代替を使用します。このオプションを無効にすると、ソースから強制的にビルドできます。

(元の名前use-binary-caches。)


ノート

これを(withまたはin)substituteに設定すると、コマンドが複数回実行されるとパッケージは再コンパイルされません。つまり、上記のコマンドは、最初にソースでコンパイルしてから再度コマンドを実行すると、すでに存在するストレージパスにアクセスします。false--optionsnix.confhello

これがあいまいになる部分です。パッケージのNixビルド式が変更されない限り、保存された出力ハッシュも変更されず、次のコンパイル出力が前のコンパイル出力と同じになるため、再コンパイルは発生しません。したがって、重複します。

したがって、誰かがパッケージに対して軽いハッキングを実行し、ローカルで試したい場合(たとえば、次をnix-shell使用)-I nixpkgs=a/local/nixpkgs/dir、または使用する必要がありますかnix-build

質問も参照してくださいnix-buildストアパスを書き換える方法は?

関連情報