Nix Flakes और Guix में उनके समकक्ष फीचर
(coopi.neocities.org)- Nix Flakes प्रोजेक्ट dependencies, locking, output schema और development environment को
flake.nixऔरflake.lockके केंद्र में बाँधते हैं, जबकि Guix channels, manifests,guix describe,guix shell,operating-systemजैसे orthogonal tools के संयोजन से उसी तरह की सुविधाएँ देता है - Flakes प्रोजेक्ट-स्तर के
inputsऔर अपने-आप बनने वालीflake.lockके ज़रिए dependencies को pin करते हैं, जबकि Guix user-स्तर केguix describe, प्रोजेक्ट में commit लिखी हुईchannels.scm, औरguix time-machineके माध्यम से reproducible environment बनाता है - शुद्धता Flakes में restricted evaluation से लागू की जाती है, जबकि Guix में इसे Scheme module structure, explicit inputs, और isolated build containers के ज़रिए design के स्तर पर हासिल किया जाता है
- Output structure में Flakes
packages,devShells,nixosConfigurationsजैसे standard attrset देते हैं, जबकि Guix में<package>, manifest,operating-system, service जैसी पारदर्शी Scheme records और files को हर command सीधे consume करती है - चयन का मानदंड यह है कि अगर आप single entry point और standard schema पसंद करते हैं तो Flakes उपयुक्त हैं, और अगर आप छोटे, स्वतंत्र tools को जोड़कर काम करने का तरीका पसंद करते हैं तो Guix अधिक उपयुक्त है
मुख्य तुलना
- Nix flake के ठीक बराबर कोई एकल Guix feature नहीं है; Nix Flakes कई समस्याओं को एक बड़े feature से हल करते हैं, जबकि Guix छोटे और orthogonal tools के संयोजन से उसका समकक्ष देता है
- Guix ने Nix daemon का पुन: उपयोग किया है और build isolation तथा store management संभालने वाले C++ components को साझा करता है
- Guix ने Nix daemon के ऊपर की अधिकांश चीज़ें, जैसे language, package definitions, और service system, Guile Scheme में नए सिरे से लागू की हैं
- Guix और Nix derivation format ATerm और daemon lineage साझा करते हैं, लेकिन daemon के ऊपर की संरचना Guix के अपने तरीके से बनी है
- Guix के पास Flakes जैसी capabilities हैं, लेकिन वह उन्हें अलग रूप में उपलब्ध कराता है
Nix Flake की बुनियादी संरचना
- Nix flake वह source tree है जिसके root में
flake.nixफ़ाइल होती है, और यह आमतौर पर Git repository के रूप में होता है flake.nixकी मौजूदगी source tree को flake बनाती है, और इस फ़ाइल मेंdescription,inputs,outputsजैसी संरचना होती हैdescriptionएक human-readable string है जो बताती है कि flake क्या प्रदान करता हैinputsदूसरे flakes, Git repos, tarballs जैसी dependencies घोषित करता है, जिन्हें Nix fetch और evaluate करकेoutputsfunction को देता हैoutputsएक function है जो resolved inputs और विशेषselfinput लेकर packages, dev shells, NixOS configurations, overlays आदि वाले structured attrset को लौटाता है-
उदाहरण संरचना और execution targets
- उदाहरण
inputsमेंnixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";का मतलब है कि GitHub केNixOS/nixpkgsrepository सेnixos-unstablebranch लाई जाएगी - उदाहरण flake
supportedSystems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" ];औरnixpkgs.lib.genAttrsका उपयोग करके कई CPU architectures के लिए outputs बनाता है - Flakes को
packages.<system>स्तर चाहिए होता है, और उदाहरण मेंpackagesके नीचेdefaultpackage कोpkgs.buildGoModuleसे परिभाषित किया गया है src = ./.;पूरे Git repository को source के रूप में उपयोग करता हैdevShellsवह development shell definition है जिसेnix developसंदर्भित करता है, और उदाहरण मेंpkgs.mkShellतथाbuildInputs = with pkgs; [ go gopls gotools ];का उपयोग किया गया है
- उदाहरण
-
flake.lockऔर pure evaluation- जब flake पर Nix command चलाई जाती है, तो Nix JSON फ़ाइल
flake.lockबनाता है, जो सभी inputs और transitive inputs को सटीक revision पर pin करती है flake.lockएक lock file है जो machines और समय के पार build reproducibility संभव बनाती है- Flakes pure evaluation को लागू करते हैं, इसलिए
$NIX_PATH,builtins.currentSystem, और environment variables को implicit रूप से आने नहीं दिया जाता; हर चीज़ explicit होनी चाहिए - Flakes द्वारा दी जाने वाली सुविधाओं को dependencies declaration, dependencies pinning, purity enforcement, standard output schema, reproducible sharing, और development environments definition के रूप में समेटा जा सकता है
- जब flake पर Nix command चलाई जाती है, तो Nix JSON फ़ाइल
Guix का समकक्ष तरीका
- Guix के पास Nix 2.4 में 1 नवंबर 2021 को Flakes आने से पहले ही Flakes की कई सुविधाओं के लिए समाधान मौजूद थे
- Guix channels mechanism लगभग 2018~2019 के दौरान पेश किया गया था
- Guix का समाधान orthogonal है, और एक single monolithic abstraction अपनाने के बजाय हर टूल को स्वतंत्र रूप से इस्तेमाल किया जा सकता है
-
Channels और dependency declaration
- Flake में dependencies सीधे
flake.nixके अंदर घोषित की जाती हैं, और उदाहरण मेंnixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";तथाhome-manager.url = "github:nix-community/home-manager";का उपयोग किया गया है - Flake input का
inputs.nixpkgs.follows = "nixpkgs";यह सुनिश्चित करता है किhome-managerअपना अलगnixpkgsinput न लाए और मौजूदा flake काnixpkgsइस्तेमाल करे, जिससेnixpkgsकी दो अलग copies बनने की स्थिति से बचा जा सके - Guix के channels वे Git repository होते हैं जिनमें Guile modules शामिल होते हैं; इनमें आम तौर पर package definitions होती हैं, लेकिन services, system configurations, और मनमाना Scheme code भी शामिल हो सकता है
- Guix channels को
~/.config/guix/channels.scmमें घोषित किया जाता है, और यह Scheme file channel records की list लौटाती है guix pullसभी channels को fetch और compile करता है, और उन modules को हरguixcommand में उपयोग के लिए उपलब्ध कराता है- Channels repository root में मौजूद
.guix-channelfile के जरिए दूसरे channels पर dependencies घोषित कर सकते हैं - Guix channels में channel dependency मोटे तौर पर flake के
inputsजैसी है, औरguix pullचलने पर transitive channel dependencies भी साथ में fetch हो जाती हैं
- Flake में dependencies सीधे
-
प्रोजेक्ट-स्तर dependencies और user-स्तर dependencies
- Flakes per-project तरीके से काम करते हैं, जहाँ हर repository का अपना
flake.nixऔर inputs होता है, जबकि channels system-wide या per-user तरीके से काम करते हैं, जहाँchannels.scmसभीguixinvocations पर लागू होता है - Flakes स्वाभाविक रूप से अलग-अलग projects को अलग dependency set रखने देते हैं, जबकि Guix में यही प्रभाव पाने के लिए आम तौर पर
guix time-machineया separate profiles का उपयोग किया जाता है - Flakes
github:NixOS/nixpkgs,git+https://...जैसी URL-like syntax का उपयोग करते हैं, जबकि channels plain Git URLs का उपयोग करते हैं - Flake syntax quick references के लिए अधिक ergonomic है, जबकि channels अधिक सरल और explicit हैं
- Flakes
flake = false;के जरिएflake.nixन रखने वाली repositories को non-flake inputs के रूप में समर्थन देते हैं - Guix में channel एक Git repository है जिसमें Scheme files होती हैं, इसलिए किसी विशेष opt-in की जरूरत नहीं होती; Guile modules वाली कोई भी repository channel बन सकती है
- Flakes per-project तरीके से काम करते हैं, जहाँ हर repository का अपना
Pinning, reproducibility, और time travel
-
flake.lockflake.lockएक JSON graph है, जिसमें हर input को सटीक commit hash पर pin किया जाता है और Nix fetch किए गए पूरे source tree के hash, यानीnarHash, को verify करता हैflake.lockrepository में commit किया जाता है, इसलिए clone करने वाले लोगों को वही dependency versions मिलती हैंflake.lockमेंoriginalवह target है जो मांगा गया था, औरlockedवह target है जो वास्तव में प्राप्त हुआflake.lockका two-layer systemnix flake lock --update-input nixpkgsकी तरह selective update को संभव बनाता है, जिसमें सिर्फ किसी खास input को अपडेट किया जाता है और बाकी को जस का तस रखा जाता है
-
guix describeऔरguix time-machine- Guix,
guix pullचलने पर सभी channels के सटीक commits रिकॉर्ड करता है, औरguix describeयह जानकारी दिखाता है guix describeके output में generation नंबर, तारीख, current का संकेत, channel नाम, repository URL, branch, और commit शामिल होते हैं- Guix के recorded channel commits lock file के समकक्ष हैं, लेकिन वे project directory की file में नहीं बल्कि
~/.config/guix/currentमें Guile profile के रूप में मौजूद होते हैं - reproducible environment साझा करने के लिए Guix में
guix time-machineका उपयोग किया जा सकता है guix time-machine --commit=8a1ab328 -- shell -m manifest.scmपहले Guix को एक खास revision पर pin करता है, फिर उसी revision की package definitions का उपयोग करकेguix shellचलाता हैguix time-machineजरूरत पड़ने पर उस revision को download और compile करता है, और ऐसा isolated environment बनाता है जिसमें package definitions ठीक उसी commit state की होती हैं- Guix में एक पैटर्न यह भी है कि pinned commits वाला
channels.scmproject repository में check in किया जाए guix time-machine -C channels.scm -- shell -m manifest.scmrepository में शामिलchannels.scmका उपयोग करके exact environment को reproduce करता है
- Guix,
-
दोनों तरीकों के बीच अंतर
flake.lockper-project और automatic है, जबकिguix describeper-user और automatic है- Pinned commits वाला
channels.scm, Guix में per-project pinning देता है, लेकिन यह manual तरीका है - Guix per-project pinning की ergonomics को बेहतर बना रहा है, लेकिन मौजूदा workflow में अभी भी अधिक explicit setup की जरूरत है
flake.lockएक machine-readable JSON graph है, जबकि Guix का समकक्ष commit hashes वाले channels को सूचीबद्ध करने वाली Scheme file है- दोनों तरीके dependency pinning के लक्ष्य को हासिल करते हैं, लेकिन flake lock अधिक structured है क्योंकि इसमें सभी transitive inputs के लिए
originalऔरlockedentries के साथ full dependency graph होता है guix time-machineऐसी सुविधा है जिसका सीधा flake equivalent नहीं है; यह सिर्फ pinned dependency versions ही नहीं, बल्कि package collection की पूरी तरह अलग historical state तक जाने की भी सुविधा देता है
शुद्धता मॉडल
- Flakes restricted evaluation context में चलते हैं, और
builtins.currentSystem,builtins.getEnv,$NIX_PATHका उपयोग प्रतिबंधित होता है या अनदेखा किया जाता है - Flakes में सब कुछ declared inputs से आना चाहिए, जिससे implicit state पर accidental dependency बनना कठिन हो जाता है
- Flakes की pure evaluation trade-off यह है कि system detection के लिए जगह-जगह explicit
systemparameters की ज़रूरत पड़ती है, और environment variables पढ़ना संभव नहीं होता - Flakes में जब impure escape hatch की ज़रूरत हो, तो
--impureको स्पष्ट रूप से पास करना पड़ता है - Guix में अलग pure evaluation mode की ज़रूरत नहीं होती, क्योंकि convention के स्तर पर evaluation पहले से ही pure होती है
- Guile modules environment variables तक तब तक पहुंच नहीं करते जब तक उन्हें explicit रूप से पास न किया जाए
- Guix में
$NIX_PATHके समकक्ष कुछ नहीं है, और packages को search path के बजाय module system के जरिए resolve किया जाता है - Guix में
builtins.currentSystemजैसी कोई अवधारणा नहीं है, और systems को package metadata और--systemflag से explicit किया जाता है - Guix की builds भी pure होती हैं, और builds isolated containers में चलती हैं जहां सिर्फ explicitly declared inputs ही दिखाई देते हैं
- Guix builds में
/usr/bin,/etc, और network access नहीं होता; network access के अपवाद सिर्फ fixed-output derivations तक सीमित होते हैं - Build sandboxing के मामले में Nix और Guix मूलतः एक ही approach साझा करते हैं
- Guix Scheme modules की संरचना के जरिए architecture स्तर पर purity हासिल करता है, जबकि Flakes मूल रूप से impure system के ऊपर restricted evaluation mode लगाकर purity लागू करते हैं
आउटपुट स्कीमा और डेटा मॉडल
-
Flake output schema
- Flakes outputs के लिए standard schema परिभाषित करते हैं, और
packages.<system>.<name>का उपयोगnix buildमें,devShells.<system>.<name>का उपयोगnix developमें, औरapps.<system>.<name>का उपयोगnix runमें होता है - Flake output schema में
nixosConfigurations.<name>,overlays.<name>,nixosModules.<name>,formatter.<system>,templates.<name>,checks.<system>.<name>भी शामिल हैं - Flake output schema की standardization से
nix build .,nix run, औरnix flake showलगातार एकसमान locations को refer करते हैं, जिससे discoverability बेहतर होती है - Flake output schema की कमी यह है कि यह rigid है; arbitrary output types जोड़ने के लिए Nix खुद में बदलाव करना पड़ता है, हालांकि एक छोटा extension mechanism मौजूद है
- Flake के
<system>parameter की वजह से multi-platform support को explicit रूप से संभालना पड़ता है, औरforAllSystems,flake-utils,flake-partsजैसी helper functions या libraries इस्तेमाल की जाती हैं
- Flakes outputs के लिए standard schema परिभाषित करते हैं, और
-
Guix के first-class data types
- Guix में Flakes जैसा कोई एकल output schema नहीं है, बल्कि first-class data types हैं जिन्हें कई commands consume कर सकते हैं
- Guix में packages को
<package>records के रूप में परिभाषित किया जाता है, औरguix install,guix buildउनका उपयोग करते हैं - Guix में manifests को Scheme files के रूप में परिभाषित किया जाता है, और
guix shell -m,guix packageउनका उपयोग करते हैं - Guix में system configs को
operating-systemके रूप में परिभाषित किया जाता है, औरguix system reconfigureउनका उपयोग करता है - Guix में home configs को
home-environmentके रूप में परिभाषित किया जाता है, औरguix home reconfigureउनका उपयोग करता है - Guix में services को
<service>records के रूप में परिभाषित किया जाता है, औरoperating-systemकाservicesfield इस्तेमाल होता है - Guix में channels Git repos होते हैं, और
guix pullउनका उपयोग करता है - Guix में package variants Scheme procedures होते हैं, और
--with-input,--transformका उपयोग किया जाता है
-
फ़ाइलें और package definitions
- Guix project package definitions वाले channel, development के लिए
manifest.scm, deployment के लिएsystem.scm, औरoperating-systemयाhome-environmentdeclarations जैसी चीज़ों का संयोजन दे सकता है - Guix में इन फ़ाइलों के लिए किसी special entry point file की ज़रूरत नहीं होती; ये सिर्फ Scheme values परिभाषित करने वाली Scheme files होती हैं
- Guix में command संबंधित
guixsubcommand को फ़ाइल देकर उसे process करता है, और अलग ceremony या schema validation की ज़रूरत नहीं होती - उदाहरण
manifest.scmdevelopment environment घोषित करने के लिएspecifications->manifestको"guile","guile-git","guile-json"package names की list देता है - उदाहरण
mylib.scmGuix में Nix derivation के समकक्ष<package>record परिभाषित करता है, और package fields को programmatically query किया जा सकता है - उदाहरण package definition में
(name "mylib"),(version "0.1.0"),(source (local-file ".")),(build-system gnu-build-system),(inputs (list guile guile-git)),(home-page "https://example.com"),(license gpl3+)शामिल हैं - Guix का
local-filebuild time पर current directory की files लाता है, और यह Nix केsrc = ./.;जैसा है - Guix का
gnu-build-system./configure && make && make installतरीका अपनाता है, और Guix मेंcmake-build-system,python-build-systemजैसे दूसरे build systems भी हैं - Guix, Nix से अलग, जहां
stdenvimplicit रूप सेgccऔरcoreutilsदेता है, dependencies को पूरी तरह explicit रखता है
- Guix project package definitions वाले channel, development के लिए
डेवलपमेंट एनवायरनमेंट
- Flakes के
devShellsउदाहरण मेंdevShells.x86_64-linux.default = pkgs.mkShell { buildInputs = with pkgs; [ go gopls gotools ]; shellHook = '' echo "Welcome to the devShell!" ''; };का उपयोग किया गया है mkShellbuild के समय shell environment बनाने वाला derivation जनरेट करता है,buildInputsshell के अंदरPATHमें जुड़ते हैं, औरshellHookshell में प्रवेश करते समय arbitrary bash चलाता है- Flake dev shell में
nix developया named shell के लिएnix develop .#my-shellसे प्रवेश किया जाता है - Guix development environment को
manifest.scmमेंspecifications->manifestको package specification strings की list देकर परिभाषित किया जा सकता है - उदाहरण Guix manifest में
"go","gopls","go-tools"घोषित हैं - Guix manifest-आधारित shell में
guix shell -m manifest.scmसे प्रवेश किया जाता है - Guix ad-hoc environment में बिना फ़ाइल के सिर्फ command line package names देकर
guix shell go gopls go-toolsकी तरह काम कर सकता है guix shellfull isolation के लिए--container, standard Linux filesystem layout की अपेक्षा करने वाले प्रोग्राम चलाने के लिए--emulate-fhs, और Guix container के भीतर Guix चलाने के लिए--nestingको सपोर्ट करता है- Guix manifests बड़े
flake.nixस्ट्रक्चर में embedded नहीं होते, बल्कि standalone Scheme files होते हैं guix shellबिना फ़ाइल के भी काम कर सकता है, लेकिनnix developको flake या legacy interface केshell.nixकी ज़रूरत होती है- Flakes
devShells.x86_64-linux.test,devShells.x86_64-linux.defaultजैसे named dev shells प्रदान करते हैं - Guix manifests named dev shells की जगह
manifest.scm,test-manifest.scmजैसी अलग-अलग फ़ाइलें साथ रखकर काम करते हैं - Nix Flakes और Guix दोनों containerized development को सपोर्ट करते हैं
सिस्टम कॉन्फ़िगरेशन
-
NixOS और Flakes
- Flakes के
nixosConfigurationsउदाहरण मेंnixpkgs.lib.nixosSystemNixOS modules की list लेकर kernel, services, config files आदि सहित full system derivation जनरेट करता है - Flake-आधारित NixOS deployment का उदाहरण command
nixos-rebuild switch --flake .#myhostहै - उदाहरण
nixosConfigurations.myhostमेंsystem = "x86_64-linux";औरmodules = [ ./configuration.nix home-manager.nixosModules.home-manager ];शामिल हैं - NixOS modules एक module system है जो
options,config,mkIf,mkDefault,mkForceके जरिए priority-based merging का उपयोग करता है - NixOS module system में कई modules एक ही option सेट करें तब भी सिस्टम priority resolve कर लेता है, इसलिए दर्जनों modules एक ही configuration में योगदान दें तब भी conflict से बचना आसान होता है
- Flakes के
-
Guix
operating-system- Guix का
operating-systemfunction नहीं बल्कि एक Scheme record है, और हर field एक named typed value होती है जिसे Guix validate करता है - Guix system deployment का उदाहरण command
guix system reconfigure config.scmहै - उदाहरण
operating-systemrecord में(host-name "myhost"),(timezone "Etc/UTC"), bootloader configuration, file systems, और services शामिल हैं - Guix bootloader configuration के उदाहरण में
grub-efi-bootloaderऔर target"/boot/efi"का उपयोग होता है, और Guix GRUB, U-Boot आदि को सपोर्ट करता है - Guix file systems list के रूप में घोषित किए जाते हैं, और
%base-file-systems/dev,/proc,/sysआदि के लिए defaults देता है - Guix services directed acyclic graph(DAG) बनाती हैं, और हर service दूसरी services को extend कर सकती है
%base-servicesShepherd init system, syslog, networking जैसी आवश्यक services प्रदान करता है- Guix system configuration में किसी special output type की ज़रूरत नहीं होती;
operating-systemrecord लौटाने वाली फ़ाइल कोguix systemमें देना पर्याप्त है - Guix की service composition नई services लिखना आसान बनाती है जिन्हें मौजूदा सिस्टम में मनचाहे तरीके से जोड़ा जा सके
- Guix का
खोजयोग्यता और रजिस्ट्री
- Flakes में
flake.nixएक standard entry point है, जिसमें project dependencies, outputs, और discoverable schema एक ही फ़ाइल में घोषित किए जाते हैं - Guix projects
manifest.scm,channels.scm,guix.scm,package.scmजैसी convention-based फ़ाइलों का उपयोग कर सकते हैं guix shellद्वारा अपने-आप पहचानी जाने वाली project file के रूप मेंguix.scmको standardize करने की कोशिशें हैं, लेकिन यहflake.nixजितना स्थापित नहीं हुआ है- Flakes में छोटा नाम URL से map करने वाली global registry flake-registry है, उदाहरण के लिए
nix run nixpkgs#hello,nix build github:NixOS/nixpkgs#firefox - Guix समान सुविधा के लिए package specifications का उपयोग करता है, उदाहरण के लिए
guix shell hello,guix install firefox - Guix में किसी arbitrary Git repository को छोटे नाम से संदर्भित करने वाली registry-जैसी समकक्ष व्यवस्था नहीं है, इसलिए URL सीधे इस्तेमाल किए जाते हैं
- Nix registry कभी-कभी भ्रम का स्रोत रही है क्योंकि हमेशा यह स्पष्ट नहीं होता कि
nixpkgsregistry entry है, local path है, या कोई और target nix flake showवह command है जो flake द्वारा प्रदान की गई सभी चीज़ों को tree view में दिखाता है- Guix में packages के लिए
guix searchऔर services के लिएguix system searchहैं, लेकिन किसी खास project या repository द्वारा दी गई सभी चीज़ें दिखाने वाला समकक्ष command नहीं है; इसके लिए Scheme files सीधे देखनी पड़ती हैं - Flakes की discoverability इस मायने में मज़बूत है कि
nix flake showproject द्वारा प्रदान की गई चीज़ों का consistent view दिखाता है - Guix projects अधिक ad-hoc होते हैं; आपको पता होना चाहिए कि कौन-सी फ़ाइल देखनी है, और कोई standard single-entry-point file नहीं होती
- Guix में सब कुछ Scheme होने के कारण बिना schema के भी मनचाही चीज़ें परिभाषित और संयोजित की जा सकती हैं, इसलिए flexibility मज़बूत है
पैकेज मॉडल और ग्राफ री-राइटिंग
- Nix में पैकेज
stdenv.mkDerivation { ... }कॉल के ज़रिए derivation लौटाने वाले functions होते हैं, और उनका परिणाम एक opaque attribute set होता है - Guix में पैकेज
<package>record होता है, जो नामित fields वाला एक transparent data structure है, इसलिए इसे standard Scheme procedures से inspect, transform और combine किया जा सकता है - Guix package definitions opaque functions नहीं बल्कि transparent records हैं, इसलिए special tooling के बिना inspect और transform को programmatically किया जा सकता है
- Guix में packages data होते हैं, इसलिए graph rewrites आसानी से किए जा सकते हैं
- Guix में
package-input-rewritingके ज़रिए पूरे dependency graph को traverse करकेperlकोperl-minimalसे बदलने का काम व्यक्त किया जा सकता है - Guix का
inheritkeywordcoreutilsके सभी fields को inherit करके केवल बताए गए fields को override करने के तरीके से पैकेज को redefine करता है - Nix में इसी तरह के उद्देश्य के लिए overlays हैं, लेकिन opaque function interface की वजह से inspect और transform करना ज़्यादा कठिन है, इसलिए usability कम हो जाती है
सुरक्षा अपडेट, बूटस्ट्रैप, प्रमाणन
- Guix का grafting सभी dependency packages को फिर से build किए बिना dependency tree में सुरक्षा अपडेट लागू करने देता है
- जब glibc जैसी low-level libraries में vulnerability होती है, तब Guix store paths को rewrite करके उन्हें patched version से बदल सकता है
- Nix सुरक्षा अपडेट की स्थिति में सब कुछ फिर से build करता है, और बड़े dependency tree में build time में कई घंटों का अंतर हो सकता है
- Guix source-based bootstrapping पर बहुत ज़ोर देता है, और पूरे system को एक छोटे trust base से build किया जा सकता है
- Guix की bootstrap chain लगभग 500-byte hex assembler से शुरू होकर, Scheme में लिखे गए
mesC compiler,tcc, और पूरे GNU toolchain तक जाती है - bootstrappable builds प्रोजेक्ट full-source bootstrap के पूरे विवरण को कवर करता है
- Nix, Guix की तुलना में, ज़्यादा binary seeds पर निर्भर करता है
- अगर bootstrap chain का audit नहीं किया जा सकता, तो यह पूरी तरह verify नहीं किया जा सकता कि system वास्तव में इच्छित source से build हुआ है या नहीं, इसलिए full-source bootstrapping trust और verifiability के लिए महत्वपूर्ण है
- Guix channels में डिफ़ॉल्ट रूप से cryptographic authentication का समर्थन होता है
- Guix channel एक “introduction” निर्दिष्ट करता है, जो किसी खास commit और उसके Ed25519 signature से बना होता है, और Guix उस introduction से current commit तक पूरी signature chain को verify करता है
- Flakes trust model के रूप में HTTPS और GitHub infrastructure का उपयोग करते हैं, जो Guix के Ed25519 channel authentication से अलग security model है
सारांश तालिका में मुख्य समकक्ष संबंध
- dependency declaration के लिए Flakes
flake.nixकेinputsका उपयोग करते हैं, जबकि Guixchannels.scmऔर.guix-channelका उपयोग करता है - dependency pinning के लिए Flakes automatic, project-specific
flake.lockका उपयोग करते हैं, जबकि Guix user-specific automaticguix describeऔर project-specific manual commit specificationchannels.scmका उपयोग करता है - pure evaluation flake mode में enforce होती है, और Guix में यह design के स्तर पर अंतर्निहित गुण है
- output schema में Flakes
outputsका structured attrset इस्तेमाल करते हैं, जबकि Guix ad-hoc Scheme records का उपयोग करता है - development environment के लिए Flakes
devShellsऔरnix developका उपयोग करते हैं, जबकि Guixmanifest.scmऔरguix shellका उपयोग करता है - system configuration के लिए Flakes
nixosConfigurationsऔर module system का उपयोग करते हैं, जबकि Guixoperating-systemऔर service DAG का उपयोग करता है - one-command reproducibility के लिए Flakes
nix build github:foo/barका उपयोग करते हैं, जबकि Guixguix time-machine -C channels.scm -- buildफ़ॉर्म का उपयोग करता है - project-specific pinning को Flakes
flake.lockसे अपने-आप संभालते हैं, जबकि Guix commit शामिलchannels.scmसे इसे manually संभालता है - discoverability के लिए Flakes
nix flake showदेते हैं, जबकि Guix Scheme module inspection पर निर्भर करता है - package model में Flakes/Nix opaque functions का उपयोग करते हैं, जबकि Guix transparent records का
- init system के रूप में Nix systemd और Guix GNU Shepherd का उपयोग करता है
- security updates में Nix full rebuild करता है, जबकि Guix तेज़ grafting का उपयोग करता है
- bootstrap trust के लिए Nix binary seeds पर, और Guix full-source bootstrap पर आधारित है
- authenticated updates में Flakes HTTPS/GitHub trust model, और Guix Ed25519 channel authentication का उपयोग करता है
- FHS support के लिए Nix
buildFHSUserEnvऔर Guix--emulate-fhsप्रदान करता है - non-Linux support में Nix macOS के लिए nix-darwin देता है, जबकि Guix GNU Hurd के साथ व्यवस्थित है
- केवल free software के मामले में Nix अनिवार्य रूप से ऐसा नहीं है और configurable है, जबकि Guix FSDG का पालन करता है
निष्कर्ष
- Flakes और Guix reproducibility, dependency management और system declaration जैसी एक ही तरह की समस्याओं को अलग-अलग architectural philosophies से हल करते हैं
- Flakes एक single feature के काफ़ी करीब हैं, जिसमें एक file, एक schema, एक lock file और conventions का एक set होता है
- Guix distribution के लिए channels, environments के लिए manifests, configuration के लिए
operating-system, reproducibility के लिएguix time-machine, और अन्य संरचनाओं के लिए Scheme records जैसे orthogonal tools का संयोजन है - अगर आप एक standard तरीका, एक entry-point file, एक output schema और एक lock format को पसंद करते हैं, तो Flakes स्वाभाविक रूप से उपयुक्त लगेंगे
- अगर आप छोटे, स्वतंत्र tools को जोड़कर इस Unix philosophy को package management पर लागू करना पसंद करते हैं कि हर tool एक काम बहुत अच्छी तरह करे, तो Guix बेहतर मेल खाएगा
- दोनों ecosystems इस विचार के इर्द-गिर्द विकसित हुए हैं कि package management functional, declarative और reproducible होना चाहिए, और वे अलग implementations के साथ उसी विचार को आगे बढ़ा रहे हैं
1 टिप्पणियां
Lobste.rs की रायें
यह साइट मोबाइल पर पढ़ने में बहुत परेशान करती है: टेक्स्ट थोड़ा छोटा है, और हर बार स्क्रॉल करने पर बाधा डालती रहती है
पहली तुलना के बाद मैं आगे पढ़ ही नहीं पाया, क्योंकि यह बार-बार विषय-सूची पर वापस उछाल देती थी
लेख पढ़ने के बाद भी मुझे अब तक ठीक से समझ नहीं आया कि प्रोजेक्ट की dependencies को कैसे specify और pin करना है। Deploy और share करने के लिए ऐसा लगता है कि
channels.scmमें हर transitive dependency का commit hash हाथ से ढूँढकर डालना पड़ता हैtime-machineशायद सिर्फ Guix package set पर काम करता है, out-of-tree dependencies पर नहींnix run github:nixos/nixpkgs/<commit hash>#<package>की तरह nixpkgs के पुराने point-in-time code को भी काफी आसानी से चलाया जा सकता हैGuix की एक अनोखी बात यह है कि यह package collection version और package manager version को अलग नहीं करता। पुराना package चलाने के लिए पुरानी Guix release भी साथ चलानी पड़ती है, और मुझे समझ नहीं आता कि कोई ऐसा क्यों चाहेगा
लेख में कहा गया है कि flakes में commits हाथ से ढूँढकर specify करने पड़ते हैं, और उसके तुरंत बाद ऐसे Guix command का उदाहरण दिया गया है जिसमें commits specify करने पड़ते हैं। Nix flake में भी
--override-inputसे nixpkgs version override किया जा सकता है, लेकिन यह गंदा लगता है, और unflake जिन चीज़ों को बेहतर करना चाहता है उनमें यह भी एक हैआमतौर पर flow यह होता है कि पहले dedicated
guix shellenvironment में development करो, फिर share करने के चरण परguix describe -f channels > channels.scmचलाकर सभी commit hashes कोchannels.scmमें लिख लोdeclaring channel dependencies docs देखने पर dependencies के commits specify किए जा सकते हैं, लेकिन अगर उन dependencies की भी dependencies हों, तो वे भी किसी specific commit पर pinned हैं या नहीं, इसे verify करने का कोई option नहीं दिखता
time-machineका--commit=notation Guix channels के लिए है, लेकिन-Cसे file से अतिरिक्त channels भी लोड किए जा सकते हैंइससे यह फ़ायदा होता है कि package manager और package records में breaking changes होने पर भी history और reproducibility नहीं खोती
लेकिन हर commit के लिए nixpkgs checkout चाहिए होगा, इसलिए शुरुआत में इसे बनाना बहुत महँगा पड़ेगा। एक बार बन जाने के बाद index को maintain करना सस्ता होगा
मैंने साइट की समस्या और इस thread के बारे में coopi को बता दिया है, उम्मीद है जल्दी ठीक हो जाएगा
पूरी तरह Guix की तरफ झुक चुके नज़रिए से भी, जैसा coopi ने कहा, अच्छा होता अगर Guix में भी Nix की तरह कोई standard file/directory होती, जैसे एक
flake.nixया एकnixdirectory, जिसमें सब कुछ समा जाए। हालाँकि Scheme modules import करने के लिए सही path specify करना पड़ता है, इसलिए शायद यह संभव न होइस Lobsters पोस्ट में वही बातें हैं जिनका लेखक ज़िक्र करता है, इसलिए
nixऔरlispटैग ही काफ़ी लगते हैंlinuxहटाने की बात मुझे convincing नहीं लगी। दोनों के बीच साझा एकमात्र kernel वही है :P हालाँकि जैसा कहा गया,unixशायद यहाँ फिट नहीं बैठताउदाहरण के लिए कुछ ऐसा: और नए channels बनाने और संभालने में मदद करने वाला
guix channelcommand भी अच्छा होगाक्या Guix में भी Nix flake के
.inputs.nixpkgs.followsजैसा कोई feature है जो transitive dependencies के pinned values को override कर सके?और लेखक की Guix संबंधी व्याख्या का बड़ा हिस्सा flakes से पहले वाले Nix की याद दिलाता है: standard entrypoint नहीं, channels का इस्तेमाल वगैरह। लेकिन Guix में type system और एक असली language होने के कारण लगता है कि वही patterns वहाँ कम दर्दनाक हैं। यह किसी ऐसी alternate history जैसा लगता है जो Nix बेहतर होता या किसी और language में लिखा गया होता तो बन सकती थी
दूसरे comments में बताई गई usability problems की वजह से इसे recommend करने में हिचक हो रही है। मैं NoScript इस्तेमाल करता हूँ जिसमें JavaScript डिफ़ॉल्ट रूप से बंद रहता है, इसलिए मुझे यह दिखा ही नहीं
फिर भी यह लेख बिल्कुल सही समय पर आया। हमारी company Nix का काफी ज़्यादा इस्तेमाल करने की दिशा में जा रही है और flakes की वजह से थोड़ी मशक्कत हो रही है, लेकिन इस लेख की व्याख्या पहले पढ़ी चीज़ों की तुलना में कहीं अधिक स्पष्ट थी
Coopi का जवाब: आज सुबह बदलाव किया था, लेकिन काम की वजह से test नहीं कर पाए, और बाद में पता चला कि JavaScript में समस्या थी
यह साइट iOS मोबाइल पर इस्तेमाल नहीं की जा सकती। लगता है पेज नीचे से लोड होने के बाद तुरंत ऊपर scroll हो जाता है, और मैं अगर एक screen से ज़्यादा नीचे जाता हूँ तो कुछ trigger होकर फिर से ऊपर भेज देता है
reading mode काम करता है, लेकिन highlighting और बाकी जो काफ़ी अच्छी detail styling थी, वह गायब हो जाती है
यह कहना सही है कि flakes जो करते हैं वह Guix के कई tools से भी किया जा सकता है, लेकिन यह भी कहना चाहिए कि Nix में भी यही समस्याएँ हल करने वाले छोटे और orthogonal tools पहले से थे और अब भी हैं
flakes जो देते हैं वह है standard project entrypoint और उससे संभव होने वाला ecosystem, जैसे registry। लेख में भी कहा गया है कि Guix में यह हिस्सा नहीं है
Guix उपयोगकर्ता मान सकते हैं कि standard entrypoint की ज़रूरत नहीं है, और बहुत से Nix उपयोगकर्ता भी अब तक ऐसा मानते आए हैं
लेकिन यह कहना कि orthogonal tools के सेट से flakes जैसी चीज़ की जा सकती है, कुछ वैसा लगता है जैसे कहना कि FreeBSD में jail से ज़रूरी सब हो जाता है इसलिए OCI support की ज़रूरत नहीं। यह इस बात को नज़रअंदाज़ करता है कि standardization ही ecosystem को संभव बनाती है
मुझे Guix में बहुत रुचि है और थोड़ा योगदान भी किया है, इसलिए मैं तुलना करना चाहूँगा कि
channels.scmके साथguix time-machineसे build करना, flake pin बदलकर Nix evaluation करने की तुलना में इतना ज़्यादा समय क्यों लेता है। अगर यह लगभग 3 गुना धीमा हो, जैसे 5~10 सेकंड की जगह 15~30 सेकंड, तो मैं उसे स्वीकार कर सकता हूँ, लेकिन जब मैंने कोशिश की थी, तब मामला उससे कहीं ज़्यादा था