Pertanyaan Cara mendapatkan kerja komplotan rahasia dan nix bersama


Sejauh yang saya mengerti, Nix adalah alternatif untuk kotak pasir kabal. Saya akhirnya berhasil menginstal Nix, tetapi saya masih tidak mengerti bagaimana cara mengganti sandbox.

Saya mengerti Anda tidak perlu komplotan rahasia menggunakan Nix dan versi terbungkus GHC; namun jika kamu mau untuk mempublikasikan paket yang Anda perlukan di beberapa titik untuk mengemasnya menggunakan cabal. Oleh karena itu, Anda harus bisa menulis dan menguji konfigurasi komputermu dalam NIX. Bagaimana kamu melakukannya?

Idealnya, saya ingin lingkungan yang mirip dengan kotak pasir kabal tetapi "berisi" dalam NIX, apakah itu mungkin? Sebenarnya, apa yang saya inginkan adalah sama dengan kotak pasir bertumpuk - karena saya biasanya mengerjakan proyek-proyek yang terbuat dari beberapa paket.

Perbarui alur kerja saya saat ini

Saat ini saya bekerja pada 2 atau 3 proyek independen (P1, P2, P3) yang masing-masing terdiri dari 2 atau 3 modul / paket cabal, katakanlah untuk P1: L11, L12 (perpustakaan)  dan E11 (dapat dieksekusi). E11 tergantung pada L12 yang bergantung pada L11. Saya terutama membagi executable dari perpustakaan karena mereka pribadi dan disimpan pada repositori git pribadi.

Secara teori, setiap proyek bisa memiliki kotak pasir sendiri (dibagi di antara submodulnya). Saya mencoba itu (memiliki sandbox umum untuk L11 L12 dan E11), tetapi itu sangat mengganggu karena, jika Anda memodifikasi L11, Anda tidak dapat membangunnya kembali karena E11 bergantung padanya, jadi saya harus menghapus E11 terlebih dahulu untuk mengkompilasi ulang L11. Mungkin tidak persis seperti itu, tetapi saya mengalami masalah yang sama. Ini akan baik-baik saja jika saya sesekali memodifikasi L11, tetapi dalam prakteknya, saya mengubahnya lebih dari E11.

Karena kotak pasir bersama tidak berfungsi, jadi saya kembali ke satu kotak pasir untuk setiap solusi paket. Ini bekerja tetapi kurang dari ideal. Masalah utamanya adalah jika saya memodifikasi L11, saya perlu mengkompilasinya dua kali (sekali dalam L11, dan kemudian lagi di E11). Juga, setiap kali saya memulai kotak pasir baru, seperti yang diketahui semua orang, saya perlu menunggu beberapa saat untuk mengunduh semua paket dan mengkompilasi ulang.

Jadi dengan menggunakan Nix, saya melompat untuk dapat mengatur "lingkungan" komplek terpisah per proyek, yang memecahkan semua masalah di atas.

Semoga ini lebih jelas.


32
2018-01-15 17:04


asal


Jawaban:


Saya melakukan semua pengembangan saya menggunakan Nix dan komplotan rahasia akhir-akhir ini, dan saya dengan senang hati mengatakan bahwa mereka bekerja dalam keharmonisan dengan sangat baik. Alur kerja saya saat ini sangat baru, karena bergantung pada fitur di dalamnya nixpkgs yang baru saja mencapai cabang master. Dengan demikian, hal pertama yang harus Anda lakukan adalah mengkloning nixpkgs dari Github:

cd ~
git clone git://github.com/nixos/nixpkgs

(Di masa depan ini tidak perlu, tetapi sekarang ini).

Penggunaan Proyek Tunggal

Sekarang kita punya nixpkgs klon, kita bisa mulai menggunakan haskellng paket paket. haskellng adalah penulisan ulang cara kami mengemas sesuatu di Nix, dan menarik bagi kami karena lebih mudah diprediksi (nama paket cocok dengan nama paket Peretasan) dan lebih dapat dikonfigurasi. Pertama, kita akan menginstal cabal2nix alat, yang dapat mengotomatisasi beberapa hal untuk kami, dan kami juga akan menginstal cabal-install untuk menyediakan cabalbisa dieksekusi:

nix-env -f ~/nixpkgs -i -A haskellngPackages.cabal2nix -A haskellngPackages.cabal-install

Dari titik ini, semuanya cukup jelas.

Jika Anda memulai proyek baru, Anda cukup menelepon cabal init di direktori baru, seperti biasanya. Ketika Anda siap untuk membangun, Anda bisa mengubah ini .cabal file ke dalam lingkungan pengembangan:

cabal init
# answer the questions
cabal2nix --shell my-project.cabal > shell.nix

Ini memberi Anda shell.nix file, yang dapat digunakan dengan nix-shell. Anda tidak perlu sering menggunakan ini - satu-satunya waktu yang biasa Anda gunakan cabal configure:

nix-shell -I ~ --command 'cabal configure'

cabal configure cache path absolut untuk semuanya, jadi sekarang ketika Anda ingin membangun Anda hanya menggunakan cabal build seperti biasa:

cabal build

Kapanpun Anda .cabal perubahan file yang perlu Anda buat ulang shell.nix - jalankan saja perintah di atas, dan kemudian cabal configure setelah itu.

Beberapa Penggunaan Proyek

Pendekatan ini berskala baik untuk beberapa proyek, tetapi memerlukan sedikit lebih banyak pekerjaan manual untuk "merekatkan" semuanya bersama-sama. Untuk mendemonstrasikan bagaimana ini bekerja, mari kita pertimbangkan socket-io Perpustakaan. Perpustakaan ini tergantung pada engine-io, dan saya biasanya mengembangkan keduanya pada saat yang bersamaan.

Langkah pertama untuk Nix-ifying proyek ini adalah untuk menghasilkan default.nix ekspresi sepanjang sisi setiap individu .cabal mengajukan:

cabal2nix engine-io/engine-io.cabal > engine-io/default.nix
cabal2nix socket-io/socket-io.cabal > socket-io/default.nix

Ini default.nix ekspresi adalah fungsi, jadi kita tidak bisa berbuat banyak sekarang. Untuk memanggil fungsi, kami menulis sendiri shell.nix file yang menjelaskan cara menggabungkan semuanya. Untuk engine-io/shell.nix, kita tidak harus melakukan sesuatu yang sangat pintar:

with (import <nixpkgs> {}).pkgs;
(haskellngPackages.callPackage ./. {}).env

Untuk socket-io, kita harus bergantung pada engine-io:

with (import <nixpkgs> {}).pkgs;
let modifiedHaskellPackages = haskellngPackages.override {
      overrides = self: super: {
        engine-io = self.callPackage ../engine-io {};
        socket-io = self.callPackage ./. {};
      };
    };
in modifiedHaskellPackages.socket-io.env

Sekarang kita punya shell.nix di setiap lingkungan, jadi kita bisa menggunakannya cabal configure seperti sebelumnya.

Pengamatan utama di sini adalah kapanpun engine-io perubahan, kita perlu melakukan konfigurasi ulang socket-io untuk mendeteksi perubahan ini. Ini sesederhana berjalan

cd socket-io; nix-shell -I ~ --command 'cabal configure'

Nix akan memperhatikan itu ../engine-io telah berubah, dan membangunnya kembali sebelum berjalan cabal configure.


46
2018-01-15 18:43