Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/matthewbauer/nix-bundle
Bundle Nix derivations to run anywhere!
https://github.com/matthewbauer/nix-bundle
nix
Last synced: 2 months ago
JSON representation
Bundle Nix derivations to run anywhere!
- Host: GitHub
- URL: https://github.com/matthewbauer/nix-bundle
- Owner: matthewbauer
- License: mit
- Created: 2016-06-14T19:51:08.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2024-08-13T19:32:16.000Z (4 months ago)
- Last Synced: 2024-09-28T09:01:58.098Z (3 months ago)
- Topics: nix
- Language: Nix
- Homepage:
- Size: 1.39 MB
- Stars: 636
- Watchers: 28
- Forks: 46
- Open Issues: 60
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-appimage - nix-bundle - Converts Nix derivations into AppImages. (AppImage developer tools / Low-level tools)
README
# nix-bundle
nix-bundle is a way to package Nix attributes into single-file executables.
## Benefits
* Single-file output
* Can be run by non-root users
* No runtime
* Distro agnostic
* No installation## Getting started
Make sure you have installed Nix already. See http://nixos.org/nix/ for more details.
Once you have a working Nix install, you can run:
```sh
$ ./nix-bundle.sh hello /bin/hello
``````hello``` indicates the Nix derivation from NixPkgs that you want to use, while ```/bin/hello``` indicates the path of the executable relative to ```hello``` that you want to run. This will create the file "hello". Running it:
```sh
$ ./hello
Hello, world!
```This is a standalone file that is completely portable! As long as you are running the same architecture Linux kernel and have a shell interpreter available it will run.
Some others to try:
```sh
./nix-bundle.sh nano /bin/nano
``````sh
./nix-bundle.sh emacs /bin/emacs
```Or if you want to try graphical applications:
```sh
# Simple X game. Very few dependencies. Quick to build and load. ~13MB
./nix-bundle.sh xskat /bin/xskat
``````sh
./nix-bundle.sh firefox /bin/firefox
``````sh
# SDL-based game. ~228MB
./nix-bundle.sh ivan /bin/ivan
```## Self-bundling (meta)
Starting with v0.1.3, you can bundle nix-bundle! To do this, just use nix-bundle normally:
```sh
NIX_PATH="nixpkgs=https://github.com/matthewbauer/nixpkgs/archive/nix-bundle.tar.gz" ./nix-bundle.sh nix-bundle /bin/nix-bundle
```## [Experimental] Create AppImage executables from Nix expressions
"nix-bundle.sh" tends to create fairly large outputs. This is largely because nix-bundle.sh "extracts" its payload up front. AppImage uses a different method where extraction only takes place when the file is accessed (through FUSE and SquashFS). You can now create a compliant "AppImage" using the "nix2appimage.sh" script:
```sh
./nix2appimage.sh emacs
```This will create a file at Emacs-x86_64.AppImage which you can execute.
Notice that there is only one argument for nix2appimage.sh. This is because the target executable will be detected from the .desktop file in ```/share/applications/*.desktop```. As a side-effect, AppImage requires your package to have a .desktop file, so packages like "hello", "coreutils", etc. will not work.
Some other examples to try:
```sh
./nix2appimage.sh firefox
``````sh
./nix2appimage.sh vlc
``````sh
./nix2appimage.sh 0ad
``````sh
./nix2appimage.sh wireshark-gtk
```These may take a while because of the large closure size.
Note that these do not currently work out of the box with NixOS. Other Linux distros should work.
## Comparison with AppImage, FlatPak, Snappy
| Name | Distro-agnostic | Runtime required | Root required | Storage |
| ---------- | --------------- | ---------------- | ------------- | ------- |
| nix-bundle | yes | no | no | Arx tarball |
| AppImage | yes | no | no | Squashfs w/ lzma compression |
| FlatPak | yes | yes | no | ? |
| Snappy | yes | yes | no | squashFS |## How it works
Nix-bundle glues together four different projects to work correctly:
* [Arx](https://github.com/solidsnack/arx) - an archive execution tool
* Creates single-file archive executable that can unpack themselves and then run some command. nix-bundle calls nix-user-chroot to bootstrap the Nix environment. It outputs a "./nix" folder.
* [nix-user-chroot](https://github.com/lethalman/nix-user-chroot) - a small bootstrap that uses Linux namespaces to call chroot
* This will create sub namespace and bind mount the "./nix" to "/nix" so that the Nix references function properly.
* [Nix](https://nixos.org/nix/) - a functional package manager
* Used to build runtime closures that are self-contained.
* [nixpkgs](https://nixos.org/nixpkgs/)
* Provides lots of different packages to choose from.## Drawbacks
Nix-bundle has some drawbacks that need to be worked on:
* Slow startup
* Large files (Firefox 150MB)
* Only compatible Linux
* Outputs built on x86-64 will not run on i386
* Requires Linux kernel with CAP_SYS_USER_NS on and permissions setup correctly