HeadlinesBriefing favicon HeadlinesBriefing.com

एक Nix Flake जो सभी को शासित करे - Omniflake

Hacker News •
×

Flakes undoubtedly here to stay हैं, और मैंने उनके बारे में अपनी राय स्पष्ट कर दी है: वे "meh" हैं। उनकी निरंतर उपस्थिति के बावजूद, एक flake इनपुट जोड़ना अभी भी एक छोटी सी परेशानी बनी हुई है जो कभी नहीं जाती। इसे एक सकारात्मक सुविधा के रूप में प्रचारित किया जाता है कि flakes फेडरेटेड हैं लेकिन वास्तविकता यह है कि मैं केंद्रीकृत flake की सादगी चाहता हूं। यही nixpkgs की सुंदरता और शक्ति थी। प्रक्रिया है: आप disko चाहते हैं, तो आप एक url जोड़ते हैं, फिर एक follows जोड़ते हैं ताकि यह अपने अपने nixpkgs को खींचना बंद कर दे, और फिर आप इसे अगले के लिए दोहराते हैं। यह Nix समुदाय में एक मीम बन गया है कि हर flake अपने अपने flake-utils को खींचता है। मैं इस उपयोगकर्ता अनुभव को स्वीकार करने से इनकार करता हूं।

इसलिए मैं सोचा: क्या एक flake हर दूसरे flake को ले जा सकता है, और आपको बस जो चाहिए उसे लेने के लिए हाथ बढ़ाना पड़ता है? Omniflake की शुरुआत: लगभग हर Nix flake एक flake इनपुट के पीछे। `inputs.omniflake.url = "github:fzakaria/omniflake";` `inputs.omniflake.inputs.nixpkgs.follows = "nixpkgs";` एक बार जब आपके पास omniflake हो जाता है, तो आप इसे किसी अन्य इनपुट की तरह उपयोग कर सकते हैं। एक पैकेज, एक शेल में या एक प्रणाली पर: `environment.systemPackages = [omniflake.flakes.nh.packages.${system}.default];` एक ओवरले: `nixpkgs.overlays = [ omniflake.flakes.rust-overlay.overlays.default ];` एक NixOS मॉड्यूल: `imports = [ omniflake.flakes.disko.nixosModules.disko ];` या एक flake में कुछ भी नहीं, सीधे कमांड लाइन से: `$ nix run 'github:fzakaria/omniflake#flakes.nh.packages.x86_64-linux.default' -- --version`

इसकी एक सुलभ वेबसाइट https://omniflake.com/ पर है जहां आप देख सकते हैं कि यह कौन से flakes ले जाता है और कुछ उपयोगी दस्तावेज़। एक बार जोड़ने के बाद, आपको लगभग बारह हजार flakes तक पहुंच मिलती है जिन्हें आप आवश्यकतानुसार लाज़ी रूप से एक्सेस कर सकते हैं। आप केवल उसी के लिए भुगतान करते हैं जिसका आप उपयोग करते हैं। यह absurd लगता है लेकिन यह काम करता है। हजारों इनपुट वाला एक flake अनुपयोग्य होना चाहिए लेकिन Nix भाषा की लाज़ीनेस और flake लॉक मैकेनिज़म के कारण यह पूरी तरह से काम करता है।

इसमें लगभग हर flake को कैसे समाहित किया जा सकता है? flakes पर एक बहुत छोटा प्राइमर: एक flake एक निर्देशिका है जिसमें एक flake.nix होता है जो दो चीज़ों की घोषणा करता है: inputs (जिन flakes पर यह निर्भर करता है) और outputs (इन इनपुट्स का एक फ़ंक्शन)। इसके बगल में flake.lock होता है जो ठीक से बताता है कि यह किस कमिट पर हल हुआ, इसलिए बिल्ड पुनरुत्पादनीय है। एक लॉक फ़ाइल केवल आपके अपने इनपुट्स को नहीं पिन करती है। यह हर flake के लिए पूरे ट्रांज़िटिव ग्राफ़ को पिन करती है। इसका मतलब है कि अगर दो चाइल्ड flakes दोनों nixpkgs पर निर्भर करते हैं, तो वे प्रत्येक के लॉक फ़ाइल में nixpkgs की अपनी-अपनी कॉपी रखेंगे, और वे अलग-अलग कमिट हो सकते हैं। यही डुप्लिकेशन है जिसके बारे में हर कोई शिकायत करता है, और यही कारण है कि follows मौजूद है: follows एक निर्भरता को फिर से लिखता है ताकि वह एक नोड की ओर इशारा करे जो आप पहले से ही रखते हैं, बजाय एक और कॉपी लाने के।

मुख्य इकाइयाँ: कंपनियाँ: Hacker News | लोग: Tim Cook

अक्सर पूछे जाने वाले प्रश्न: Omniflake क्या है और यह Nix flake इनपुट प्रबंधन को कैसे हल करता है?

Omniflake एक एकल Nix flake है जो लगभग बारह हजार अन्य Nix flakes को एक ही इनपुट के पीछे एकत्रित करता है। प्रत्येक flake को मैन्युअल रूप से जोड़ने और follows निर्देशिकाओं के साथ कॉन्फ़िगर करने के बजाय, उपयोगकर्ता केवल omniflake इनपुट जोड़ते हैं और आवश्यकतानुसार किसी भी निहित flake को लाज़ी रूप से एक्सेस करते हैं। यह Nix की लाज़ी इवैल्यूएशन और flake लॉक मैकेनिज़म के कारण काम करता है, इनपुट्स की बड़ी संख्या के बावजूद।

अक्सर पूछे जाने वाले प्रश्न: Omniflake क्या है और यह Nix flake इनपुट प्रबंधन को कैसे हल करता है?

उत्तर: Omniflake एक एकल Nix flake है जो लगभग बारह हजार अन्य Nix flakes को एक ही इनपुट के पीछे एकत्रित करता है। प्रत्येक flake को मैन्युअल रूप से जोड़ने और follows निर्देशिकाओं के साथ कॉन्फ़िगर करने के बजाय, उपयोगकर्ता केवल omniflake इनपुट जोड़ते हैं और आवश्यकतानुसार किसी भी निहित flake को लाज़ी रूप से एक्सेस करते हैं। यह Nix की लाज़ी इवैल्यूएशन और flake लॉक मैकेनिज़म के कारण काम करता है, इनपुट्स की बड़ी संख्या के बावजूद।