Flox 1.0 – Mã hóa môi trường phát triển mã nguồn mở bằng Nix
(github.com/flox)- Flox là một nền tảng môi trường phần mềm dành cho các đội ngũ kỹ thuật, quản lý các môi trường có thể tái tạo giống nhau từ laptop của lập trình viên đến CI và production bằng một manifest duy nhất
- Nền tảng dựa trên Nix, nhưng kiến thức về Nix là tùy chọn; kiến trúc này giảm drift môi trường bằng manifest khai báo và đầu vào hash nội dung được cố định bằng mật mã
- Hoạt động trên macOS, Linux và Windows WSL2; có thể tìm kiếm/cài đặt hơn 120.000 gói từ Nixpkgs, đồng thời build và publish phần mềm riêng dưới dạng các gói có thể tái tạo
- Tạo môi trường cô lập theo từng dự án qua luồng
flox init,flox install,flox activate; khi kích hoạt thì công cụ xuất hiện, khi thoát thì biến mất, giúp giữ hệ thống sạch sẽ - Tập trung vào quản lý vòng đời môi trường ở cấp tổ chức, bao gồm chia sẻ qua FloxHub, tạo OCI image, chạy dịch vụ, SBOM, vá CVE, SCA và môi trường thực thi xác định cho AI coding agent
Vấn đề Flox muốn giải quyết
- Flox là nền tảng định nghĩa môi trường phát triển trong một tệp và cho phép chạy cùng môi trường đó trên laptop của lập trình viên, CI và production
- Nếu các trình quản lý gói truyền thống tập trung vào việc cài đặt gói trên một máy đơn lẻ, Flox quản lý vòng đời gói và môi trường trên toàn tổ chức
- Có ba thuộc tính cốt lõi
- Khai báo: mô tả các công cụ, biến môi trường và dịch vụ cần cho dự án trong một tệp
- Có thể tái tạo: cùng một định nghĩa tạo ra cùng một môi trường ở bất kỳ hệ thống được hỗ trợ nào
- Có thể kết hợp: có thể phân lớp môi trường theo dự án, đội ngũ và pipeline
Người dùng mục tiêu và môi trường sử dụng
- Đội Platform/DevX có thể chuẩn hóa toolchain trên toàn tổ chức và mở rộng môi trường chuẩn mà không buộc mọi người phải học Nix
- Đội Security/AppSec có thể xử lý SBOM, phản ứng nhanh với CVE, nguồn gốc dependency và build có thể tái tạo
- Lập trình viên có thể dùng môi trường có thể tái tạo theo từng dự án trên macOS, Linux và Windows WSL2; cách hoạt động gần với môi trường ảo hơn là container hay VM
- AI coding agent có được môi trường xác định để build và chạy mã sinh ra theo cùng một cách mỗi lần
- Ví dụ đối tượng là Claude Code, Cursor, Copilot và Codex
Khả năng tái tạo và bảo mật chuỗi cung ứng
- Môi trường Flox được định nghĩa bằng manifest khai báo và được khóa vào đầu vào hash nội dung cố định bằng mật mã
- Cùng một lockfile được diễn giải thành cùng các gói trên từng hệ thống được hỗ trợ, nên môi trường giữa các máy được duy trì giống nhau
- Có thể dùng một định nghĩa môi trường duy nhất trên laptop của lập trình viên, sandbox của AI agent, CI và production
- Có thể sử dụng hơn 120.000 gói từ Nixpkgs
- Có thể build phần mềm riêng từ source thành các gói có thể tái tạo và publish để cả đội sử dụng
- Dựa trên khả năng tái tạo, Flox giúp dễ xử lý việc tạo SBOM, phân tích thành phần phần mềm (SCA), tự động vá lỗ hổng/CVE, xác minh nguồn gốc dependency và các bản build có thể audit
Cài đặt và workflow cơ bản
- Flox CLI được cài đặt theo cách native trên macOS, Linux và Windows WSL2
- Luồng sử dụng cơ bản là tạo môi trường trong dự án, cài các gói cần thiết rồi kích hoạt môi trường
flox init: tạo môi trường trong dự ánflox install python3 nodejs: cài gói vào môi trườngflox activate: vào môi trường
- Ví dụ trong README cho thấy bên trong môi trường đã kích hoạt,
python3 --versionchạy raPython 3.13.13, cònnode --versionchạy rav24.15.0 - Khi thoát khỏi môi trường, các công cụ đã cài sẽ biến mất, giúp tránh xung đột giữa các dự án và giữ hệ thống sạch sẽ
Tính năng chính
- Create: có thể tạo môi trường khai báo cạnh mã nguồn bằng
flox initvà tự động kích hoạt - Search: có thể tìm hơn 120.000 gói của Nixpkgs bằng
flox search - Share: với
flox push/flox pull, các thành viên trong đội có thể lấy cùng một môi trường chuẩn duy nhất trên FloxHub - Containerize: với
flox containerize, có thể biến môi trường Flox thành OCI image mà không cần Dockerfile - Build & publish: với
flox build/flox publish, có thể build phần mềm riêng thành gói có thể tái tạo và publish cho đội - Services: với
flox services start, có thể chạy database, queue và tiến trình nền như một phần của môi trường; chúng khởi động khi kích hoạt và dừng khi thoát - Configure: định nghĩa biến môi trường, shell hook và script kích hoạt theo cách khai báo trong
manifest.toml - AI-ready: thông qua flox-agentic, hỗ trợ AI coding agent build/chạy với cùng dependency trong mỗi lần thực thi
Vị trí với người dùng Docker và Nix
- Flox không phải là công nghệ container và không phải là phương án thay thế Docker
- Trong Docker, packaging và cô lập container thường bị trộn lẫn, còn Flox cho rằng cần tách đóng gói phần mềm khỏi phương thức cô lập được chọn
- Môi trường Flox hoạt động theo cùng một cách trên bare metal, VM và container
flox containerizetạo OCI image có chứa môi trường phần mềm, có thể dùng cùng Docker, Kubernetes và các container runtime khác- Với người dùng Nix, Flox là công cụ bổ sung chứ không phải công cụ thay thế
- Cung cấp dịch vụ trung tâm FloxHub để chia sẻ gói và môi trường cộng tác
- Gộp activation hook, dịch vụ và shell profile vào một tệp TOML khai báo duy nhất
Nguồn gốc và tài nguyên hỗ trợ
- Flox bắt đầu từ triển khai Nix doanh nghiệp quy mô lớn của D.E. Shaw group và đã được dùng để giúp Nix trở nên dễ tiếp cận trong các tổ chức kỹ thuật quy mô lớn
- Tài nguyên liên quan
- Documentation: tutorial, tài liệu tham chiếu, hướng dẫn
- FloxHub: khám phá và chia sẻ môi trường
- Discourse: câu hỏi, thảo luận, thông báo
- Blog: bài viết chuyên sâu và workflow
- VS Code extension: quản lý môi trường Flox trong editor
- Các vấn đề liên quan đến bảo mật được tiếp nhận qua
security@flox.dev - Giấy phép của Flox CLI là GPLv2
1 bình luận
Ý kiến trên Hacker News
Ron, chúc mừng ra mắt. Điều tôi tò mò là mô hình doanh thu sẽ như thế nào
Có CEO, công ty và nhân viên, mà nhìn trên Crunchbase thì có vẻ đã nhận 24 triệu USD vốn đầu tư, nhưng không tìm thấy thông tin giá cả trên landing page hay trong tài liệu
Kể cả khi đăng nhập FloxHub bằng hồ sơ GitHub cũng không thấy tùy chọn thanh toán, nên tôi tò mò về kế hoạch này
Ứng dụng khách mã nguồn mở và dịch vụ FloxHub để chia sẻ môi trường được công bố hôm nay sẽ miễn phí vĩnh viễn
Sau này, chúng tôi muốn cung cấp một danh mục phần mềm riêng tư mạnh mẽ hơn, chạy bên trên Flox Catalog cơ bản
Nếu bạn cần phân phối các build nội bộ của mình hoặc cần các phiên bản gói mã nguồn mở đã được chỉnh sửa trong Flox, chúng tôi dự định sẽ giúp bạn dễ dàng tạo danh mục riêng của mình để bổ sung cho Flox Catalog vốn luôn miễn phí
Về lâu dài, chúng tôi muốn bán các giải pháp doanh nghiệp dưới dạng thuê bao và dịch vụ để giúp doanh nghiệp quản lý tốt hơn chuỗi cung ứng phần mềm rộng và phân mảnh, và chúng tôi cho rằng việc doanh nghiệp cùng chia sẻ chi phí phát triển các công cụ tùy chỉnh cho mình là hợp lý
Mỗi khi thấy những câu kiểu trong README như “giúp Nix dễ hơn cho người dùng mới” hay diễn đạt tương tự là tôi lại thấy vướng
Tôi nghĩ mình cũng khá có năng lực, nhưng chưa từng có lần nào dùng Nix mà cảm thấy “cái này dễ thật”
Tôi rất thích các khái niệm của Nix, nhưng trải nghiệm người dùng thì quá tệ. Có thể công cụ này giải quyết được điều đó, nhưng để tới được mức ấy thì phải lần mò qua tài liệu gần như không có, những cách làm đã bị bỏ từ lâu, rồi chỉnh cấu hình mãi không dứt, nên rất dễ nản
Dù sao thì cứ mỗi lần thấy thứ gì liên quan đến Nix là tôi lại nghĩ “mong đến ngày chuyện này trở nên dễ hơn”
.nixhay flakesCác khái niệm cơ bản cứ liên tục trôi khỏi đầu, nên mỗi lần thiết lập thứ gì mới là tôi lại phải tra lại, rồi cuối cùng kiệt sức
Việc debug sự cố cũng khó, và để biết điều gì sai thì phải lục tung những lệnh rất đặc thù cùng hệ thống tệp ác mộng
Tôi thích ý tưởng, nhưng trong thực tế nó tạo cảm giác cản trở quá nhiều
Có nền tảng Haskell nên tôi thấy quen hơn đôi chút, nhưng bản thân cú pháp cũng không trực quan với người dùng mới
Nó hơi giống lúc học Rust, nên cũng thú vị
Vấn đề cốt lõi của các sản phẩm kiểu “mang sức mạnh của Nix mà không cần đường cong học tập” là đằng sau vẫn có Nix và
/nix/store, mà Nix thì cố ý không tự động dọn dẹp chuyện nàyKhi người dùng thử một công cụ che giấu Nix, đến lúc nào đó ổ đĩa rồi cũng đầy, nhưng vì không biết cách giải phóng dung lượng nên khó mà gọi là thân thiện với người dùng
Nếu người dùng biết mình đang cài Nix và đi qua quá trình học, họ có thể xây dựng mô hình tư duy về
/nix/storelà gì và phải quản lý nó ra sao, nên tình huống sẽ khácTôi tò mò không biết các bạn định xử lý độ phức tạp tầng dưới này như thế nào
Môi trường của Flox không chỉ là symlink đơn giản mà là định dạng khai báo, bên trong có flakes, nên có thể xóa đi và nếu cần thì tái tạo lại được
Vì vậy việc garbage collection sẽ ít mang tính phá hủy hơn so với khi dùng
nix-env/nix profile, và có thể dọn các thế hệ cũ quyết liệt hơnChiến lược là luôn đảm bảo có cách khai báo và tái lập để khôi phục những gì đã dọn, rồi dùng các heuristic như dung lượng trống, tuổi, mức độ không được dùng gần đây, tần suất sử dụng thấp để tránh ổ đĩa bị đầy
Ngược lại, tôi chưa từng gặp vấn đề này trong Nix. Nó chỉ rất rõ cách dọn rác, và cũng dễ điều tra xem thứ gì còn lại và vì sao nó còn ở đó
Lý do nó không được bật mặc định là vì cũng như các garbage collector khác, nó có thể gây phiền, và không có một chính sách nào phù hợp cho tất cả mọi người
Rốt cuộc nếu có quá nhiều GC root thì vẫn phải đưa ra quyết định
Mỗi khi dùng máy tính, phía sau có hàng nghìn thứ phức tạp đến mức vô lý đang diễn ra, nên tôi không hiểu vì sao việc trừu tượng hóa Nix lại bị xem là điều gì đó đặc biệt
Chúc mừng ra mắt. Tôi thật sự rất thích Nix, nhưng cũng phải thừa nhận rằng trải nghiệm onboarding của nó, nói nhẹ thì cũng tệ và tệ nhất thì thực sự khủng khiếp
Vì vậy, mọi nỗ lực giúp nó dễ tiếp cận hơn đều đáng được hoan nghênh. Một CLI mang tính mệnh lệnh gần hơn rất nhiều với cách mà nhiều người mong đợi và cảm thấy thoải mái, nên tôi nghĩ đó là hướng đi tốt
Tôi cũng rất đồng cảm với việc đơn giản hóa quá trình sử dụng môi trường của người khác
Tuy vậy, điều có vẻ quan trọng mà tôi chưa thấy là tích hợp IDE. Việc khởi chạy IDE từ dòng lệnh bên trong môi trường không trực quan với nhiều đồng nghiệp của tôi, và tôi thực sự đã nhiều lần chẩn đoán đây là nguyên nhân gốc của các vấn đề
Tôi cũng tò mò chuyện sẽ ra sao khi cần hạ xuống dùng “Nix thật”. Ví dụ, với những môi trường phức tạp hơn một chút như cấu hình toolchain cross-compile cho Rust, tôi lo là sẽ rơi xuống vực
Lấy ví dụ phát triển Rust, tôi đã phải nhét một
shellHookdài vào flake để Rust-Analyzer hoạt động đúng; tôi muốn biết trong Flox có thể làm kiểu cấu hình này như thế nàoKhông rõ đây là thứ mà Flox định trừu tượng hóa đi, hay nếu không thì người không biết Nix sẽ phải tự tìm ra bằng cách nào
Tôi không định nói là hoàn toàn bất khả thi, tôi thật lòng mong nó thành công, chỉ là hiện giờ tôi vẫn chưa hình dung ra cách làm
Hiện tại ý tưởng là cho phép tham chiếu flake trong một số trường cụ thể, hoặc có các điểm vào theo kiểu Nix
Cái này vẫn chưa được công khai hay tài liệu hóa, nên mong bạn chờ thêm
Tôi hoàn toàn đồng ý rằng có một ranh giới rất mong manh giữa việc che giấu độ phức tạp và phơi bày năng lực
Tôi muốn biết lợi ích của việc dùng Flox thay vì
nix-shellhaynix developthông thường là gìChúng tôi muốn bạn có thể thành công mà không cần học ngôn ngữ biểu thức Nix hay hiểu cấu trúc nội bộ của Nix
Chúng tôi cũng thêm một mức độ định hướng và trau chuốt nhất định. Ví dụ có giao diện lai giữa mệnh lệnh/khai báo, nên nếu chạy
flox install && flox listthì các thay đổi sẽ được phản ánh vào TOML. Trong khi đó vớinix developthì bạn phải chỉnh sửa biểu thức Nixnix developđưa bạn vào shell bash, cònflox activatecó thể vào shell bash hoặc zsh, và chúng tôi cũng có kế hoạch thêm hỗ trợ fishViệc quản lý môi trường bằng Git được hỗ trợ như các công cụ Nix, đồng thời chúng tôi cũng bổ sung chia sẻ môi trường theo những cách mà các công cụ đó không làm được, như
flox push/flox pull/flox activate -rNếu tạo tài khoản, bạn có thể xem các package trong môi trường của tôi tại https://hub.flox.dev/mkenigs/default, và nếu có CLI thì có thể kiểm tra bằng
flox list -r mkenigs/default, rồi dùng vớiflox activate -r mkenigs/defaultTôi nghĩ điều đó dễ tiếp thu hơn rất nhiều đối với người không biết ngôn ngữ biểu thức Nix so với việc gửi cho họ một
flake.nixHoàn toàn có khả năng những công cụ như Flox hay devenv sẽ end-of-life, hoặc không theo kịp nixpkgs đúng cách, hoặc gặp một trong nhiều kiểu mục ruỗng phần mềm khác
Trong khi đó,
nix developsẽ còn tồn tại miễn là Nix Flakes còn tồn tại, và nó cũng có động lực cung cấp lộ trình di trú sang cách tiếp theoQuan trọng hơn, mọi tầng trừu tượng cuối cùng đều sẽ rò rỉ. CLI của Flox có thể trông gọn gàng hơn, nhưng để dùng hiệu quả thì rốt cuộc bạn vẫn sẽ phải học Nix
Tôi không thấy lý do gì phải học gấp đôi số thứ cần thiết
Tôi muốn biết Flox so với dự án Devbox hiện có (https://www.jetpack.io/devbox) thì như thế nào
Flox có giải pháp cloud tùy chọn không, có thể cài các phiên bản package Nix cụ thể không, và xử lý phụ thuộc theo hệ điều hành ra sao
Tôi đã dùng các công cụ kiểu này suốt 5 năm nay, nên muốn biết Flox mang đến điều gì mới so với những gì đã có
Tôi thực sự không hiểu vì sao phải dùng cái này thay vì Nix thông thường, có thể giải thích không
Cái này với tôi có vẻ đơn giản hơn gấp 100 lần
Nhưng Nix được xây dựng từ những nguyên lý đầu tiên để trở nên rất đa dụng, nên đường cong học tập khá dốc
Flox là công cụ cố gắng đơn giản hóa bằng cách thu hẹp phạm vi vấn đề và cung cấp các tầng trừu tượng cùng giao diện chuyên biệt, để bạn có thể tận dụng năng lực của Nix mà không cần trở thành chuyên gia Nix ngay từ ngày đầu tiên
Tôi rất quan tâm đến môi trường phát triển có thể tái lập, và ở chỗ làm tôi cũng đã dùng dev container rất ổn trong vài năm nay
Khoảng một năm trước tôi nghe về Nix, và ban đầu rất hào hứng vì lời hứa của nó quá hấp dẫn, nhưng quá trình onboarding thì thật khủng khiếp với tôi
Tôi hình dung khá rõ môi trường phát triển mình muốn tạo ra, nhưng luôn có cảm giác mình đang bỏ sót điều gì đó ở cách tiếp cận
Tôi rất vui khi thấy có công cụ mới cố cải thiện toàn bộ trải nghiệm này, và hy vọng nếu cứ tiếp tục thử thì một lúc nào đó tôi sẽ “ngộ” ra
Tôi muốn hỏi là với bạn, vào khoảnh khắc nào thì Nix bắt đầu “khớp hẳn”
Bạn đã xem video Microservices này chưa? https://www.youtube.com/watch?v=y8OnoxKotPQ
Lúc đó tôi đang dẫn dắt đội ngũ sản phẩm cho lập trình viên ở Facebook, và chúng tôi bắt đầu một dự án đưa khả năng từ xa vào phát triển cục bộ
Hàng nghìn lập trình viên khi ấy phải chờ 45 phút cho mỗi cold build
Một trong những bước đầu tiên là vẽ ra toàn bộ vòng đời phát triển phần mềm để xác định phần nào của toolchain cần phải xây lại
Nhìn vào bảng trắng ở cuối video có thể gợi lại cảm giác đó: ngay khoảnh khắc chúng tôi hình dung được mọi thứ mình đã làm phức tạp đến mức nào, tôi đã bị cuốn vào suy nghĩ “đây không thể là cách chúng ta làm việc được”
Lần cuối tôi dùng Nix thì vẫn còn khá nhiều bối rối quanh flakes
Có chỗ hướng dẫn bảo nên dùng, chỗ khác lại nói vẫn còn đang phát triển, nên tôi muốn biết giờ tình hình đã khá hơn chưa
Theo tôi, vấn đề với flakes đến từ hai điểm
Một là nó bị gắn nhãn experimental gần 5 năm nay, khiến người dùng mới thấy khó hiểu, trong khi trên thực tế nó đã được dùng rất phổ biến ở gần như mọi nơi
Hai là có vẻ tồn tại mâu thuẫn giữa https://determinate.systems/ và những người dùng/nhà phát triển Nix lâu năm. Có vẻ Determinate Systems bị chỉ trích là dùng Nix để phục vụ lợi ích riêng nhưng không đóng góp trở lại
Theo hiểu biết của tôi thì Determinate Systems đã thúc đẩy flakes, nên có lẽ vì vậy mà một số người phản đối
Kết luận là gần như tất cả mọi người đều đã chấp nhận flakes, và các hướng dẫn không dùng nó phần lớn có lẽ đã cũ
Liên kết liên quan: https://discourse.nixos.org/t/introducing-flakehub/32044
Nhãn “experimental” mang ý nghĩa gần với độ ổn định của API hơn là mức độ hoàn thiện hay lỗi
Trong một số tình huống có thể có vấn đề về hiệu năng, nhưng đã có cách обход và cũng đang có giải pháp lâu dài được phát triển
Dù vậy, tôi vẫn dùng flakes rất nhiều ở nhà và ở chỗ làm
Tối qua tôi thử dùng Flox trên macOS, và thấy nó cài Nix vào profile mặc định tách biệt với bản Nix mà Nix-Darwin quản lý ở
/run/current-system/sw/bin, rồi tạo symbolic link bản sao đó vào/usr/local/binCũng không có hướng dẫn nào cho người dùng Nix hiện có, tức là người dùng NixOS hoặc người đã cài Nix trên các bản phân phối khác nhưng không có định dạng gói phân phối mà Flox hỗ trợ
Tôi muốn biết liệu điều này là vì Flox là một trình quản lý profile bên thứ ba cho Nix nên phải phụ thuộc vào những thứ như định dạng manifest của Nix profile vốn không ổn định, hay thực ra nó có thể dùng với nhiều phiên bản Nix khác nhau nhưng chỉ là chưa được kiểm thử
Tôi cũng muốn biết liệu hỗ trợ cài Flox dựa trên Nix có được xem là tính năng sẽ hỗ trợ sau này không
Ngoài ra, có nói rằng hỗ trợ fish sắp tới, nhưng có thể chỉ cho tôi phần tích hợp shell của lệnh con
activatethực sự nằm ở đâu trong mã nguồn hoặc cấu hình Flox khôngTôi đã định tạm thời ghép bằng thứ như fenv trong lúc chờ hỗ trợ fish chính thức, nhưng dù đã lướt qua bản cài đặt và mã nguồn thì vẫn không thấy rõ chỗ nào để móc vào
Hiện tại, cách tốt nhất để dùng với fish theo tôi là
FLOX_SHELL=zsh flox activate -- fish. Nó không hỗ trợ alias, nhưng hầu hết mọi thứ có lẽ sẽ hoạt độngTôi cũng muốn biết liệu bạn đang thực sự muốn sửa mã nguồn, hay chỉ đang cố hiểu cấu trúc để làm một giải pháp tạm thời
Với các shell không phải bash hay zsh thì nó báo lỗi quanh chỗ này: https://github.com/flox/flox/blob/9e18a3ceaa185006bae95a4827...
Nếu bạn muốn tự sửa thì tôi sẵn sàng giải thích thêm về bối cảnh