2019-01-17 23:59:01 +03:00
# niv
2019-12-08 17:13:53 +03:00
![GitHub Actions ](https://github.com/nmattia/niv/workflows/Test/badge.svg?branch=master )
2019-04-15 16:17:37 +03:00
[![Netlify Status ](https://api.netlify.com/api/v1/badges/48532eaa-259f-4ca2-aadf-67f7c6b957fd/deploy-status )](https://niv.nmattia.com)
2019-02-01 00:05:45 +03:00
2019-06-15 17:44:20 +03:00
Painless dependencies for [Nix] projects. Read more in the [Getting started ](#getting-started ) section below.
2019-01-17 23:59:01 +03:00
2019-04-14 15:49:13 +03:00
< p align = "center" >
< img src = "https://niv.nmattia.com/niv.svg" >
< / p >
2020-06-23 13:37:02 +03:00
* [Install ](#install )
* [Build ](#build )
* [Usage ](#usage )
* [FAQ ](#frequently-asked-questions )
2019-02-05 17:18:42 +03:00
## Install
2020-01-11 21:47:01 +03:00
`niv` is available in [`nixpkgs` ](https://github.com/NixOS/nixpkgs ) on the
`master` branch as `niv` . It is also available on the `release-19.09` branch as
`haskellPackages.niv` . Otherwise, run:
2019-02-05 17:18:42 +03:00
``` bash
2020-02-21 12:39:03 +03:00
$ 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=
2019-02-05 17:18:42 +03:00
```
## Build
2019-01-18 01:00:48 +03:00
Inside the provided nix shell:
``` bash
2019-04-05 12:43:57 +03:00
$ repl
2019-01-18 01:00:48 +03:00
```
2019-03-01 12:24:15 +03:00
Run the test suite with this command:
``` bash
$ ./script/test
```
2019-01-17 23:59:01 +03:00
## Usage
2019-02-08 21:29:48 +03:00
`niv` simplifies [adding ](#add ) and [updating ](#update ) 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 ](#add ): inserts a package in `nix/sources.json` .
* [Update ](#update ): updates one or all packages in `nix/sources.json` .
* [Drop ](#drop ): deletes a package from `nix/sources.json` .
2020-01-20 18:55:25 +03:00
`niv` has some utility functions:
2019-02-08 21:29:48 +03:00
2019-04-15 00:50:42 +03:00
* [Init ](#init ): bootstraps a Nix project, in particular creates a
2019-02-08 21:29:48 +03:00
`nix/sources.json` file containing `niv` and `nixpkgs` as well as a
`nix/sources.nix` file that returns the sources as a Nix object.
* [Show ](#show ): shows the packages' information.
2020-01-20 18:55:25 +03:00
* [Modify ](#modify ): modifies attributes _without_ performing an update.
2019-01-17 23:59:01 +03:00
2019-09-22 00:12:19 +03:00
### 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. |
2019-09-22 10:32:42 +03:00
| 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` . |
2019-09-22 00:12:19 +03:00
| 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 ](#getting-started ) and [full command
description](#commands).
2019-06-15 17:44:20 +03:00
### Getting started
2019-02-11 22:33:10 +03:00
2019-02-11 22:56:42 +03:00
This section covers common use cases:
2019-02-11 22:33:10 +03:00
* [Bootstrapping a Nix project ](#bootstrapping-a-nix-project ).
2019-02-11 23:23:39 +03:00
* [Tracking a different nixpkgs branch ](#tracking-a-nixpkgs-branch ).
2019-02-11 22:56:42 +03:00
* [Importing packages from GitHub ](#importing-packages-from-github ).
2019-02-11 22:33:10 +03:00
* [Fetching packages from custom URLs ](#using-custom-urls ).
#### Bootstrapping a Nix project
2019-06-15 17:44:20 +03:00
Use the `init` command when starting a new Nix project or when porting an
existing Nix project to niv:
2019-02-11 22:33:10 +03:00
``` shell
$ niv init
...
$ tree
.
2019-06-15 17:44:20 +03:00
└── nix
├── sources.json
└── sources.nix
1 directory, 2 files
2019-02-11 22:33:10 +03:00
```
2019-02-11 22:56:42 +03:00
The file `nix/sources.json` is the file used by niv to store versions and is
initialized with niv and nixpkgs:
2019-02-11 22:33:10 +03:00
``` json
{
"nixpkgs": {
2019-02-11 23:23:39 +03:00
"url": "https://github.com/NixOS/nixpkgs-channels/archive/109a28ab954a0ad129f7621d468f829981b8b96c.tar.gz",
2019-02-11 22:33:10 +03:00
"owner": "NixOS",
2019-12-16 16:30:44 +03:00
"branch": "nixos-19.09",
2019-02-11 22:33:10 +03:00
"url_template": "https://github.com/< owner > /< repo > /archive/< rev > .tar.gz",
"repo": "nixpkgs-channels",
2019-02-11 23:23:39 +03:00
"sha256": "12wnxla7ld4cgpdndaipdh3j4zdalifk287ihxhnmrzrghjahs3q",
2019-02-11 22:33:10 +03:00
"description": "Nixpkgs/NixOS branches that track the Nixpkgs/NixOS channels",
2019-02-11 23:23:39 +03:00
"rev": "109a28ab954a0ad129f7621d468f829981b8b96c"
2019-02-11 22:33:10 +03:00
},
"niv": {
2019-02-11 22:54:27 +03:00
"homepage": "https://github.com/nmattia/niv",
2019-02-11 23:23:39 +03:00
"url": "https://github.com/nmattia/niv/archive/72e77204544527279e8f1e2d982d29503482b8f4.tar.gz",
2019-02-11 22:33:10 +03:00
"owner": "nmattia",
"branch": "master",
"url_template": "https://github.com/< owner > /< repo > /archive/< rev > .tar.gz",
"repo": "niv",
2019-02-11 23:23:39 +03:00
"sha256": "1zjcyzxhq9iwxh58j5d7sx1vz5s3r1f6gpmnfgj2a3rxmclwvn3c",
"description": "Easy dependency management for Nix projects",
"rev": "72e77204544527279e8f1e2d982d29503482b8f4"
2019-02-11 22:33:10 +03:00
}
}
```
2019-06-15 17:44:20 +03:00
To use those dependencies `import` the file `nix/sources.nix` , e.g.:
2019-02-11 22:33:10 +03:00
``` nix
2019-06-15 17:44:20 +03:00
{ sources ? import ./sources.nix }: # import the sources
2019-02-11 22:33:10 +03:00
with
{ overlay = _: pkgs:
2019-06-15 17:44:20 +03:00
{ niv = import sources.niv {}; # use the sources :)
2019-02-11 22:33:10 +03:00
};
};
2019-06-15 17:44:20 +03:00
import sources.nixpkgs # and use them again!
2019-02-11 22:33:10 +03:00
{ overlays = [ overlay ] ; config = {}; }
```
#### Tracking a nixpkgs branch
The `init` command sets the `nix/sources.json` file to track the latest commit
2019-12-16 16:30:44 +03:00
present on nixpkgs 19.09 when the command was run. Run the following command to
2019-06-16 11:22:57 +03:00
update it:
2019-02-11 22:33:10 +03:00
``` shell
$ niv update nixpkgs
```
To change the branch being tracked run this command:
``` shell
2019-12-16 16:30:44 +03:00
$ niv update nixpkgs -b nixos-19.09 # equivalent to --branch nixos-19.09
2019-02-11 22:33:10 +03:00
```
#### 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:
``` shell
$ niv add stedolan/jq
```
The following data was added in `nix/sources.json` for `jq` :
``` json
{
"homepage": "http://stedolan.github.io/jq/",
2019-02-11 23:23:39 +03:00
"url": "https://github.com/stedolan/jq/archive/9fa2e51099c55af56e3e541dc4b399f11de74abe.tar.gz",
2019-02-11 22:33:10 +03:00
"owner": "stedolan",
"branch": "master",
"url_template": "https://github.com/< owner > /< repo > /archive/< rev > .tar.gz",
"repo": "jq",
2019-02-11 23:23:39 +03:00
"sha256": "0819rvk8057qgcqvgn7fpldvly2pfdw9fxcjrlqa8gr59p8a1cic",
2019-02-11 22:33:10 +03:00
"description": "Command-line JSON processor",
2019-02-11 23:23:39 +03:00
"rev": "9fa2e51099c55af56e3e541dc4b399f11de74abe"
2019-02-11 22:33:10 +03:00
}
```
#### 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` :
``` shell
$ 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 ](#add ) and [update ](#update )).
For updating the version of GHC used run this command:
``` shell
$ niv update ghc -v 8.6.2
```
### Commands
2019-01-29 00:37:13 +03:00
```
2019-09-23 23:37:17 +03:00
niv - dependency manager for Nix projects
2020-02-02 15:27:43 +03:00
version: 0.2.13
2019-01-24 23:58:22 +03:00
2019-12-09 20:34:50 +03:00
Usage: niv [-s|--sources-file FILE] COMMAND
2019-01-24 23:58:22 +03:00
2019-01-29 00:37:13 +03:00
Available options:
2019-12-09 20:34:50 +03:00
-s,--sources-file FILE Use FILE instead of nix/sources.json
2019-01-29 00:37:13 +03:00
-h,--help Show this help text
2019-01-24 23:58:22 +03:00
2019-01-29 00:37:13 +03:00
Available commands:
init Initialize a Nix project. Existing files won't be
modified.
2019-11-24 16:46:33 +03:00
add Add a GitHub dependency
2019-01-31 01:56:35 +03:00
show
2019-01-29 00:37:13 +03:00
update Update dependencies
2020-01-20 18:55:25 +03:00
modify Modify dependency attributes without performing an
update
2019-01-29 00:37:13 +03:00
drop Drop dependency
```
2019-01-17 23:59:01 +03:00
2019-02-11 22:33:10 +03:00
#### Add
2019-01-17 23:59:01 +03:00
```
2019-01-29 00:37:13 +03:00
Examples:
2019-01-17 23:59:01 +03:00
2019-01-29 00:37:13 +03:00
niv add stedolan/jq
2019-12-16 16:30:44 +03:00
niv add NixOS/nixpkgs-channels -n nixpkgs -b nixos-19.09
2019-01-29 00:37:13 +03:00
niv add my-package -v alpha-0.1 -t http://example.com/archive/< version > .zip
2019-01-17 23:59:01 +03:00
2019-11-24 16:46:33 +03:00
Usage: niv add PACKAGE [-n|--name NAME] ([-a|--attribute KEY=VAL] |
2019-11-24 22:21:35 +03:00
[-s|--string-attribute KEY=VAL] | [-b|--branch BRANCH] |
[-o|--owner OWNER] | [-r|--repo REPO] | [-v|--version VERSION] |
[-t|--template URL] | [-T|--type TYPE])
2019-11-24 16:46:33 +03:00
Add a GitHub dependency
2019-01-17 23:59:01 +03:00
2019-01-29 00:37:13 +03:00
Available options:
2019-01-31 22:44:10 +03:00
-n,--name NAME Set the package name to < NAME >
2019-11-24 22:21:35 +03:00
-a,--attribute KEY=VAL Set the package spec attribute < KEY > to < VAL > , where
< VAL > may be JSON.
-s,--string-attribute KEY=VAL
Set the package spec attribute < KEY > to < VAL > .
2019-01-31 22:44:10 +03:00
-b,--branch BRANCH Equivalent to --attribute branch=< BRANCH >
-o,--owner OWNER Equivalent to --attribute owner=< OWNER >
-r,--repo REPO Equivalent to --attribute repo=< REPO >
-v,--version VERSION Equivalent to --attribute version=< VERSION >
2019-01-31 01:56:35 +03:00
-t,--template URL Used during 'update' when building URL. Occurrences
of < foo > are replaced with attribute 'foo'.
2019-03-01 00:22:21 +03:00
-T,--type TYPE The type of the URL target. The value can be either
'file' or 'tarball'. If not set, the value is
inferred from the suffix of the URL.
2019-01-29 00:37:13 +03:00
-h,--help Show this help text
2019-01-31 01:56:35 +03:00
2019-11-24 13:57:05 +03:00
Experimental commands:
2019-11-24 16:46:33 +03:00
git Add a git dependency. Experimental.
github Add a GitHub dependency
2020-03-30 22:38:08 +03:00
local Add a local dependency. Experimental.
2019-01-17 23:59:01 +03:00
```
2019-02-11 22:33:10 +03:00
#### Update
2019-01-27 01:39:38 +03:00
2019-01-29 00:37:13 +03:00
```
Examples:
2019-11-10 18:03:33 +03:00
niv update # update all packages
niv update nixpkgs # update nixpkgs
niv update my-package -v beta-0.2 # update my-package to version "beta-0.2"
2019-01-23 23:55:26 +03:00
2019-11-24 22:21:35 +03:00
Usage: niv update [PACKAGE] ([-a|--attribute KEY=VAL] |
[-s|--string-attribute KEY=VAL] | [-b|--branch BRANCH] |
2019-01-31 22:44:10 +03:00
[-o|--owner OWNER] | [-r|--repo REPO] | [-v|--version VERSION]
2019-03-01 00:22:21 +03:00
| [-t|--template URL] | [-T|--type TYPE])
2019-01-29 00:37:13 +03:00
Update dependencies
2019-01-23 23:55:26 +03:00
2020-01-20 18:55:25 +03:00
Available options:
-a,--attribute KEY=VAL Set the package spec attribute < KEY > to < VAL > , where
< VAL > may be JSON.
-s,--string-attribute KEY=VAL
Set the package spec attribute < KEY > to < VAL > .
-b,--branch BRANCH Equivalent to --attribute branch=< BRANCH >
-o,--owner OWNER Equivalent to --attribute owner=< OWNER >
-r,--repo REPO Equivalent to --attribute repo=< REPO >
-v,--version VERSION Equivalent to --attribute version=< VERSION >
-t,--template URL Used during 'update' when building URL. Occurrences
of < foo > are replaced with attribute 'foo'.
-T,--type TYPE The type of the URL target. The value can be either
'file' or 'tarball'. If not set, the value is
inferred from the suffix of the URL.
-h,--help Show this help text
```
#### Modify
```
Examples:
niv modify nixpkgs -v beta-0.2
niv modify nixpkgs -a branch=nixpkgs-unstable
2020-01-31 22:08:52 +03:00
Usage: niv modify PACKAGE [-n|--name NAME] ([-a|--attribute KEY=VAL] |
2020-01-20 18:55:25 +03:00
[-s|--string-attribute KEY=VAL] | [-b|--branch BRANCH] |
[-o|--owner OWNER] | [-r|--repo REPO] | [-v|--version VERSION]
| [-t|--template URL] | [-T|--type TYPE])
Modify dependency attributes without performing an update
2019-01-29 00:37:13 +03:00
Available options:
2020-01-31 22:08:52 +03:00
-n,--name NAME Set the package name to < NAME >
2019-11-24 22:21:35 +03:00
-a,--attribute KEY=VAL Set the package spec attribute < KEY > to < VAL > , where
< VAL > may be JSON.
-s,--string-attribute KEY=VAL
Set the package spec attribute < KEY > to < VAL > .
2019-01-31 22:44:10 +03:00
-b,--branch BRANCH Equivalent to --attribute branch=< BRANCH >
-o,--owner OWNER Equivalent to --attribute owner=< OWNER >
-r,--repo REPO Equivalent to --attribute repo=< REPO >
-v,--version VERSION Equivalent to --attribute version=< VERSION >
2019-01-31 01:56:35 +03:00
-t,--template URL Used during 'update' when building URL. Occurrences
of < foo > are replaced with attribute 'foo'.
2019-03-01 00:22:21 +03:00
-T,--type TYPE The type of the URL target. The value can be either
'file' or 'tarball'. If not set, the value is
inferred from the suffix of the URL.
2019-01-29 00:37:13 +03:00
-h,--help Show this help text
```
2019-01-23 23:55:26 +03:00
2019-02-11 22:33:10 +03:00
#### Drop
2019-01-27 01:39:38 +03:00
2019-01-29 00:37:13 +03:00
```
Examples:
2019-01-27 01:39:38 +03:00
2019-01-29 00:37:13 +03:00
niv drop jq
2019-02-08 21:07:05 +03:00
niv drop my-package version
2019-01-27 01:39:38 +03:00
2019-02-08 21:07:05 +03:00
Usage: niv drop PACKAGE [ATTRIBUTE]
2019-01-29 00:37:13 +03:00
Drop dependency
2019-01-23 23:55:26 +03:00
2019-01-29 00:37:13 +03:00
Available options:
-h,--help Show this help text
```
2019-01-17 23:59:01 +03:00
2019-02-11 22:33:10 +03:00
#### Init
2019-02-08 21:29:48 +03:00
```
Usage: niv init
Initialize a Nix project. Existing files won't be modified.
Available options:
-h,--help Show this help text
```
2019-02-11 22:33:10 +03:00
#### show
2019-02-08 21:29:48 +03:00
```
2019-07-01 18:29:37 +03:00
Usage: niv show [PACKAGE]
2019-02-08 21:29:48 +03:00
Available options:
-h,--help Show this help text
```
2019-01-18 00:01:09 +03:00
[Nix]: https://nixos.org/nix/
2019-02-11 22:33:10 +03:00
[jq]: https://stedolan.github.io/jq/
[GHC]: https://www.haskell.org/ghc/
2020-06-23 13:37:02 +03:00
## 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:
``` shell
$ 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:
1. create a .netrc file with the following content
```
machine github.com
login YOUR_GITHUB_USER_NAME
password YOUR_GITHUB_TOKEN
```
2. add the path to the above file to `/etc/nix/nix.conf` :
```
netrc-file = /PATH/TO/.netrc
```
3. set `GITHUB_TOKEN` env var when calling `niv add`
```
GITHUB_TOKEN=$YOUR_GITHUB_TOKEN niv add ...
```