Nix:一個純粹的函式式包管理器
Nix 既是一個Javascript包管理器:一個可以下載和執行的預構建包的來源,也是一種函式性語言,可以幫助我們以可重現的方式編寫“構建表示式”。Nix 表示式是一個具有一個副作用的函式:建立構建本身的規範。
Nix 方法的主要思想是將軟體元件彼此隔離地儲存在中央元件儲存中,路徑名包含構建元件所涉及的所有輸入的加密雜湊。
為什麼?
與包管理器打交道是當今開發人員體驗的核心,但仍然充滿陷阱。我們傾向於將我們的信任外包給包快取,例如 NPM 或 Hex,然後將它們返回的任何內容合併到我們的系統中。大多數情況下,這很好用,因為包管理器有誠實行事的動機。
但是,存在單點故障,作為這個中心故障點變得有問題的一個例子是:攻擊者可以修改一個包以在所謂的數字供應鏈攻擊中包含惡意軟體。
這就是今天現有包管理器所沒有的:可重複性。
可重複性是指在您自己的系統上一點一點地重新建立包的構建的能力。無論以您的方式丟擲什麼包,您都可以在本地重新構建它並檢查您是否具有預期的構建輸出。這類似於通過計算其 sha256 雜湊值來驗證從 Web 下載的二進位制檔案,並將其與二進位制檔案釋出者提供的雜湊值進行比較。
它消除了信任提供商的需要,並使開發人員檢測故障或攻擊的成本大大降低。可重複性意味著您的系統和應用程式的安全性,以及您的開發人員的安心。
達到這種可重現狀態的方法是對本地環境不做任何假設。Nix 中的所有內容都必須由使用者明確宣告。大多數構建工具或環境都依賴於對本地環境的假設,並儘可能地處理它,但如果你想提供一種在任何地方構建任何東西的方法,你就必須放棄對本地環境的任何束縛。Nix 通過強制你宣告你想要的包以及如何將它們組合在一起來做到這一點。因為您的環境或構建的每個部分都是明確的,所以您可以實現隔離和可重現性。
如何做到?
首先,使用 Nix 構建的所有內容都放在一箇中央儲存中,預設情況下是 `/nix/store`,這與您的 Linux FHS(檔案系統層次結構標準)不同。
其次,每個構建的工件都用一個雜湊標識,它是包的完整依賴圖的摘要識別符號,涉及的特定於平臺的構建步驟,以及定義如何構建它的 Nix 表示式。
假設您的公司維護了一個 25 年前使用 C 編譯器構建的工具。它無法安全升級,因為如果升級,整個世界的銀行系統都會崩潰。也許您保留一臺專用膝上型電腦作為數字時間膠囊來維護此工具。相反,您可以使用所需的任何版本的工具建立一個 Nix shell,固定且永不升級。這個環境是孤立的,並且可以與系統上的所有其他 C 版本配合使用,因為它只是另一個 Nix 包。您可以與任何人共享此環境,他們只需一個“nix-shell”命令即可擁有與您相同的環境。
相關文章
- 虛擬函式 純虛擬函式函式
- 閉包函式(匿名函式)的理解函式
- js純函式學習筆記(一)JS函式筆記
- vue在一個函式中呼叫另外一個函式Vue函式
- 讓自己純粹一點
- js中在一個函式中引用另一個函式中的函式,可以這麼做JS函式
- JS函式表示式——函式遞迴、閉包JS函式遞迴
- 介面、虛擬函式、純虛擬函式、抽象類函式抽象
- 回撥函式 與 函式閉包函式
- 函式閉包函式
- 測開之函式進階· 第2篇《純函式》函式
- javascript純函式是什麼JavaScript函式
- 函式物件、裝飾器、閉包函式函式物件
- 簡單純粹
- go 閉包函式Go函式
- js函式閉包JS函式
- 一個函式學excel函式Excel
- C++ 介面(純虛擬函式)C++函式
- 3D高斯損失函式(1)單純損失函式3D函式
- 純粹的數學之美
- 函式閉包機制函式
- 理解Python函式閉包Python函式
- 寫一個深度克隆函式函式
- 一個map函式引發的血案函式
- [譯] 如何使用純函式式 JavaScript 處理髒副作用函式JavaScript
- C++ 函式過載,函式模板和函式模板過載,選擇哪一個?C++函式
- 函式性純UI元件:morphonent - DEV社群函式UI元件dev
- 抽象基類和純虛擬函式抽象函式
- 【譯】JavaScript中純函式是什麼JavaScript函式
- 深入理解javascript系列(十四):純函式JavaScript函式
- javascript學習筆記--函式的返回值可以是一個函式JavaScript筆記函式
- JavaScript函數語言程式設計(純函式、柯里化以及組合函式)JavaScript函數程式設計函式
- 第五篇 匿名函式、內建函式、import的使用、包的使用函式Import
- Node.js 如何優雅的封裝一個實用函式的 npm 包Node.js封裝函式NPM
- 【SUBTOTAL】一個“以一敵十”的函式(二)函式
- 函式一函式
- 箭頭函式和普通函式的10個區別函式
- PHP 每日一函式 — 字串函式 crypt ()PHP函式字串