8.1 KiB
niv
Painless dependencies for Nix projects. Read more in the Getting started section below.
Install
niv
is available in nixpkgs
as niv
:
$ nix-env -iA nixpkgs.niv
Alternatively, run the following command to install the development version:
$ nix-env -iA niv -f https://github.com/nmattia/niv/tarball/master \
--substituters https://niv.cachix.org \
--trusted-public-keys niv.cachix.org-1:X32PCg2e/zAm3/uD1ScqW2z/K0LtDyNV7RdaxIuLgQM=
Build
Inside the provided nix shell:
$ repl
Run the test suite with this command:
$ ./script/test
Usage
niv
simplifies adding and updating dependencies in Nix
projects. It uses a single file, nix/sources.json
, where it stores the data
necessary for fetching and updating the packages.
- Add: inserts a package in
nix/sources.json
. - Update: updates one or all packages in
nix/sources.json
. - Drop: deletes a package from
nix/sources.json
.
niv
has some utility functions:
- Init: bootstraps a Nix project, in particular creates a
nix/sources.json
file containingniv
andnixpkgs
as well as anix/sources.nix
file that returns the sources as a Nix object. - Show: shows the packages' information.
- Modify: modifies attributes without performing an update.
Configuration
The following environment variables are read by niv
:
Name | Note |
---|---|
GITHUB_TOKEN | When set, the value is used to authenticate GitHub API requests. |
GITHUB_HOST | The GitHub host to use when fetching packages. Port may be appended here. |
GITHUB_API_HOST | The host used when performing GitHub API requests. Use GITHUB_API_PORT for specifying the port. |
GITHUB_API_PORT | The port used when performing GitHub API requests. Defaults to 443 for secure requests. Defaults to 80 for insecure requests. See also: GITHUB_INSECURE . |
GITHUB_INSECURE | When set to anything but the empty string, requests are performed over http instead of https . |
GITHUB_PATH | The base path used when performing GitHub API requests. |
The next two sections cover common use cases and full command description.
Getting started
This section covers common use cases:
- Bootstrapping a Nix project.
- Tracking a different nixpkgs branch.
- Importing packages from GitHub.
- Fetching packages from custom URLs.
Bootstrapping a Nix project
Use the init
command when starting a new Nix project or when porting an
existing Nix project to niv:
$ niv init
...
$ tree
.
└── nix
├── sources.json
└── sources.nix
1 directory, 2 files
The file nix/sources.json
is the file used by niv to store versions and is
initialized with niv and nixpkgs:
{
"nixpkgs": {
"url": "https://github.com/NixOS/nixpkgs/archive/109a28ab954a0ad129f7621d468f829981b8b96c.tar.gz",
"owner": "NixOS",
"branch": "nixos-19.09",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz",
"repo": "nixpkgs",
"sha256": "12wnxla7ld4cgpdndaipdh3j4zdalifk287ihxhnmrzrghjahs3q",
"description": "Nix Packages collection",
"rev": "109a28ab954a0ad129f7621d468f829981b8b96c"
},
"niv": {
"homepage": "https://github.com/nmattia/niv",
"url": "https://github.com/nmattia/niv/archive/72e77204544527279e8f1e2d982d29503482b8f4.tar.gz",
"owner": "nmattia",
"branch": "master",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz",
"repo": "niv",
"sha256": "1zjcyzxhq9iwxh58j5d7sx1vz5s3r1f6gpmnfgj2a3rxmclwvn3c",
"description": "Easy dependency management for Nix projects",
"rev": "72e77204544527279e8f1e2d982d29503482b8f4"
}
}
To use those dependencies import
the file nix/sources.nix
, e.g.:
{ sources ? import ./sources.nix }: # import the sources
with
{ overlay = _: pkgs:
{ niv = import sources.niv {}; # use the sources :)
};
};
import sources.nixpkgs # and use them again!
{ overlays = [ overlay ] ; config = {}; }
Tracking a nixpkgs branch
The init
command sets the nix/sources.json
file to track the latest commit
present on nixpkgs 19.09 when the command was run. Run the following command to
update it:
$ niv update nixpkgs
To change the branch being tracked run this command:
$ niv update nixpkgs -b nixos-19.09 # equivalent to --branch nixos-19.09
Importing packages from GitHub
The add
command will infer information about the package being added, when
possible. This works very well for GitHub repositories. Run this command to add
jq to your project:
$ niv add stedolan/jq
The following data was added in nix/sources.json
for jq
:
{
"homepage": "http://stedolan.github.io/jq/",
"url": "https://github.com/stedolan/jq/archive/9fa2e51099c55af56e3e541dc4b399f11de74abe.tar.gz",
"owner": "stedolan",
"branch": "master",
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz",
"repo": "jq",
"sha256": "0819rvk8057qgcqvgn7fpldvly2pfdw9fxcjrlqa8gr59p8a1cic",
"description": "Command-line JSON processor",
"rev": "9fa2e51099c55af56e3e541dc4b399f11de74abe"
}
Using custom URLs
It is possible to use niv to fetch packages from custom URLs. Run this command
to add the Haskell compiler GHC to your nix/sources.json
:
$ niv add ghc \
-v 8.4.3 \
-t 'https://downloads.haskell.org/~ghc/<version>/ghc-<version>-i386-deb8-linux.tar.xz'
The option -v
sets the "version" attribute to 8.4.3
. The option -t
sets a
template that can be reused by niv when fetching a new URL (see the
documentation for add and update).
For updating the version of GHC used run this command:
$ niv update ghc -v 8.6.2
Commands
replace_niv_help
Add
replace_niv_add_help
Update
replace_niv_update_help
Modify
replace_niv_modify_help
Drop
replace_niv_drop_help
Init
replace_niv_init_help
show
replace_niv_show_help
Frequently Asked Questions
Can you use private GitHub repositories?
Yes. There are two ways:
1. Use the git protocol
When using the git protocol, your public SSH keypair is used to authenticate you:
$ niv add git git@github.com:my_user/my_private_repo
2. Use the netrc file
in order to niv add
a private github repo you'll need to:
- create a .netrc file with the following content
machine github.com
login YOUR_GITHUB_USER_NAME
password YOUR_GITHUB_TOKEN
- add the path to the above file to
/etc/nix/nix.conf
:
netrc-file = /PATH/TO/.netrc
- set
GITHUB_TOKEN
env var when callingniv add
GITHUB_TOKEN=$YOUR_GITHUB_TOKEN niv add ...
How do I import a subpath of a source?
In order to use the directory dir
of a my-package
, use the following
pattern:
let
sources = import ./nix/sources.nix;
in sources.my-package + "/dir"
in this example, sources.my-package
becomes my-package
's root directory, and + "/dir"
appends the
subdirectory.
How can I import NixOS modules?
After the package containing the modules has been niv add
ed, importing the
modules is straightforward:
let
sources = import ./nix/sources.nix;
in {
imports = [ (sources.package + "/path/to/module") ];
}