• This repository has been archived on 07/Oct/2022
  • Stars
    star
    189
  • Rank 203,058 (Top 5 %)
  • Language
    Python
  • Created over 12 years ago
  • Updated over 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Abandoned! Generate Nix expressions for Python packages

pypi2nix - generate Nix expressions for Python packages

See https://pypi2nix.readthedocs.io/en/latest/ for documentation.

pypi2nix is a command line tool that generates Nix expressions from different requirements.txt. This is useful for:

  • Building a Nix derivation for a program written in Python as part of packaging it.

  • Setting up a development environment to hack on a program written in Python.

    The only way we can fix bugs with pypi2nix is if you report them. Please create an issue if you discover problems.

pypi2nix will (until further notice) only work with latest unstable channel. This is due to ongoing changes in Python infrastructure happening in Nixpkgs.

The Nixpkgs manual section about Python makes good reading if you haven't seen it already.

1. Installation

pypi2nix is part of nixpkgs. If you just want to use pypi2nix on your system, it is recommended that you install it via the regular means, e.g. nix-env -iA nixos.pypi2nix on NixOS or nix-env -iA nixpkgs.pypi2nix on other systems utilizing nix.

System Requirements

Make sure Nix is installed:

% curl https://nixos.org/nix/install | sh

Currently pypi2nix is only tested against linux systems. Supported nixpkgs channels are nixos-19.09 and nixos-unstable. Due to the nature of nixos-unstable the occasional breakage of pypi2nix is to be expected. We try to provide fixes in that regard in a timely manner.

Ad hoc Installation (Simple)

For just installing the package with a command, use nix-env:

nix-env -if https://github.com/nix-community/pypi2nix/tarball/master

Declarative Installation (Advanced)

If you prefer to explicitly declare each installed package in your Nix(OS) or project configuration, you can do the following:

First, import the package from its default.nix by fetching the whole git repository with pkgs.fetchgit. Afterwards you can just add the imported attribute the list of installed software.

Below you find an example for NixOS' configuration.nix. Other methods like home-manager work similar:

let
  pypi2nix = import (pkgs.fetchgit {
    url = "https://github.com/nix-community/pypi2nix";
    # adjust rev and sha256 to desired version
    rev = "v2.0.1";
    sha256 = "sha256:0mxh3x8bck3axdfi9vh9mz1m3zvmzqkcgy6gxp8f9hhs6qg5146y";
  }) {};
in
  environment.systemPackages = [
    # your other packages
    pypi2nix
  ];

2. Usage

The easiest way to generate a Nix expressions is to invoke:

% pypi2nix -e packageA -e packageB==0.1

If you also have a requirements.txt file for your Python project you can use the -r option.

% pypi2nix -e packageA -e packageB==0.1 \
    -r requirements.txt -r requirements-dev.txt

What is being generated

Option -V tells pypi2nix which python version to be used. To see which Python versions are available consult pypi2nix --help.

Once Nix expressions are generated you should be able to see 3 new files:

  • requirements_frozen.txt - full frozen set for your for your pypi2nix call. This is the output you would expect from pip freeze.
  • requirements.nix is a file which contains a nix expression to for the package set that was built.
  • requirements_override.nix - this is an empty file which lets you override generated nix expressions.

Building generated packages

Build one package:

% nix build -f requirements.nix packages.empy

Build all packages:

% nix build -f requirements.nix packages

Build python interpreter with all packages loaded:

% nix build -f requirements.nix interpreter
% ./result/bin/python -c "import empy"

Enter development environment:

% nix run -f requirements.nix interpreter
[user@localhost:~/dev/nixos/pypi2nix) % python -c "import empy"

Using generated packages

If you are working on a project where its dependencies are defined in requirements.txt then you can create a default.nix and add generated packages as buildInputs, as demonstrated here:

{}:
let
  python = import ./requirements.nix { inherit pkgs; };
in python.mkDerivation {
  name = "ProjectA-1.0.0";
  src = ./.;
  buildInputs = [
    python.packages."coverage"
    python.packages."flake8"
    python.packages."mock"
    python.packages."pytest"
    python.packages."pytest-asyncio"
    python.packages."pytest-cov"
    python.packages."pytest-mock"
    python.packages."pytest-xdist"
    python.packages."virtualenv"
  ];
  propagatedBuildInputs = [
    python.packages."aiohttp"
    python.packages."arrow"
    python.packages."defusedxml"
    python.packages."frozendict"
    python.packages."jsonschema"
    python.packages."taskcluster"
    python.packages."virtualenv"
  ];
  ...
}

As you can see you can access all packages via python.packages."<name>". If you want to depend on all packages you can even do:

propagatedBuildInputs = builtins.attrValues python.packages;

Command line options

-v
Increase amount and detail of information output to the user. Verbosity levels are ERROR, WARNING, INFO and DEBUG in that order. The default verbosity is INFO.
-q
Reduce amount and detail of information output to the user. See -v for more information.
-I/--nix-path TEXT
Add entries to the NIX_PATH environment variable similarly to how -I works with nix executables like nix-build. This can be useful for generating package sets based on a different nixpkgs version than the one used one the local system.
--nix-shell PATH
Path to an alternative version of the nix-shell command. The default is the first executable that will be found in the current PATH of the system.
--version
Show the current version of pypi2nix
--basename TEXT
This option determins the name the produced files. So with --basename environment you would get the files environment.nix, environment_frozen.nix and environment_override.nix.
--extra-build-inputs/-E TEXT
Extra build inputs that the required python packages need to run, e.g. libffi or libgl. In that case you would provide -E "libffi libgl". These nix packages will be available in the build environment for the wheels.
--emit-extra-build-inputs/--no-emit-extra-build-inputs
These options let you control if external build dependencies specified via -E will end up in the generated nix package set. Please note that if you select this option, your overrides need to make sure that python packages find their respective external dependencies.
--extra-env/-N TEXT
Extra environment variables that will be passed to the build environment. Note that you can use nix expressions in this string, e.g. -N 'BERKELEYDB_DIR=${pkgs.db.dev}'.
--enable-tests/-T
Specify this flag if you want to enable the check phase of all packages in the generated nix expression. Please note that this feature is highly exprimental and will probably not work for your use case.
--python-version/-V
Specify the python version you want the requirement set to be built with. The default is 3 which translates to the python3 derivation of nixpkgs.
--requirements/-r FILE
Specify a requirements file, similar as you would with pip. pypi2nix tries to be fully compatible with the file format of pip.
--editable/-e TEXT
This option allows you to specify individual requirements that get added to the requirement set, e.g. pypi2nix -e attrs, pypi2nix -e $HOME/src/myproject#egg=myproject or pypi2nix -e .#egg=myegg.
--setup-requires/-s TEXT
Allows you to specify python packages that need to be present in the build environment of other packages, a good example of this would be setuptools-scm. Note that pypi2nix tries to detect these dependencies on its own. You only need to specify this flag in cases where a package author or maintainer forgot to mention build time dependencies in their setup or neither setup.cfg nor pyproject.toml is used.
--overrides/-O URL
Allows you to specify additional overrides that conform to the general structure of requirements_override.nix. We support regular URLs with http and https scheme and also git. An example for using https would be pypi2nix -O https://myoverrides.test/overrides.nix. Reusing an overlay from a git repository would be done like so: pypi2nix -O git+https://github.com/nix-community/pypi2nix.git&path=requirement_override.nix. Please keep in mind that these overrides are incorporated in a nix expression with a precalculated hash value. So if the file changes upstream your generated package can not be built anymore.
--default-overrides/--no-default-overrides
Pull in overrides from https://github.com/nix-community/pypi2nix-overrides. This feature is enabled by default.
--wheels-cache/-W TEXT
A location where prebuilt wheels can be found. This option will ultimately be passed to pip --find-links. Only point to wheels that are built through pypi2nix on your own or a very similar system.
--build-directory TEXT

Warning A bug in pypi2nix currently prevents some packages from being built with this option set. It is recommended to not use this flag.

The directory where pypi2nix would build the python environment to generate the desired nix expression. If not specified, the build directory will be temporary and is deleted before the program exits.

--dependency-graph-output PATH
Output the dependency information of processed packages to the specified path. The output format is yaml.

3. When it doesn't work

I hope nobody is expecting pypi2nix to do always a perfect job. In Python packaging, there are just too many different cases that we will never be able to cover. What pypi2nix tries to do is to get you very close.

Sometimes pypi2nix fails entirely. If this happens, open a bug -- it's almost always a bug in pypi2nix. However, sometimes pypi2nix succeeds but the resulting requirements.nix file fails during the building of your Python package. Depending on what the problem is, this section may be helpful.

Non-Python/system dependencies

Quite a few Python packages require non-Python dependencies to be present at build time. These packages will fail to build with error messages about not being able to find foo.h or some fooconfig file. To work around this, pypi2nix has -E options which can be used to include extra non-Python dependencies.

For example, psycopg2 requires pg_config binary to be present at installation time:

% pypi2nix -v -V 2.7 -e psycopg2 -E postgresql

lxml requires libxml2 and libxslt system package:

% pypi2nix -v -V 2.7 -e lxml -E libxml2 -E libxslt

Additional environment variables

Some packages expect additional environment variables to be set:

% pypi2nix -v -V 2.7 -e bsddb3 -N 'BERKELEYDB_DIR=${pkgs.db.dev}'

Using requirements_override.nix

Some other failures might be caused because the derivation that pypi2nix wrote was incomplete. A very common situation is that pypi2nix didn't include all the dependencies of some package. As an example, execnet depends on setuptools-scm, but pypi2nix may not detect this.

When this happens, Nix will fail to build execnet, perhaps with an error message from distutils/setuptools complaining that it can't find a distribution for setuptools-scm. What's happening here is that normally execnet would fetch setuptools-scm from PyPI, but Nix disables network access to guarantee reproducability. So when you build execnet, it fails to find setuptools-scm.

For these situations, pypi2nix provides a requirements_override.nix file, which lets you override anything that it generated. You can even add new packages to the dependency set this way.

As an example, let's add setuptools-scm as a build-time dependency of execnet. Here's the requirements_override.nix:

{ pkgs, python }:

self: super: {

  "execnet" = python.overrideDerivation super."execnet" (old: {
    buildInputs = old.buildInputs ++ [ self."setuptools-scm" ];
  });

}

In a similar way, you can add or remove any Python package.

Shared overrides

In addition to the empty autogenerated requirements_overrides.nix file, you can include pre-existing overrides files. These overrides will be included the same way as your requirements_overrides.nix.

The pypi2nix author also maintains a set of "default" overrides at https://github.com/nix-community/pypi2nix-overrides/blob/master/overrides.nix -- you can include these by using the --default-overrides argument to pypi2nix. These overrides are designed in such a way that they only override dependencies that were already present in your requirements.nix.

You can also include an overrides file using the -O command line argument. pypi2nix can fetch these overrides from a local file or over certain common protocols.

http and https

pypi2nix --overrides https://raw.githubusercontent.com/nix-community/pypi2nix-overrides/master/overrides.nix

Note that the generated Nix expression will check if contents of the overrides file differs from when the Nix expression was built, and fail if this was the case (or the file does not exist anymore).

Local files
pypi2nix --override ../some/relative/path --override /some/absolute/path
Git repositories

pypi2nix --override git+https://github.com/nix-community/pypi2nix.git#path=overrides.nix

If you want to import a file from a specific git repository you have to prefix its URL with git+, quite similar to how you would do in a requirements.txt file for pip.

4. Advanced Use

Creating default.nix for your project

Nothing speaks better than an example:

{ }:

let
  pkgs = import <nixpkgs> {};
  python = import ./requirements.nix { inherit pkgs; };
in python.mkDerivation {
  name = "projectA-1.0.0";
  src = ./.;
  buildInputs = [
    python.packages."coverage"
    python.packages."flake8"
    python.packages."mock"
    python.packages."pytest"
    python.packages."pytest-asyncio"
    python.packages."pytest-cov"
    python.packages."pytest-mock"
    python.packages."pytest-xdist"
  ];
  propagatedBuildInputs = [
    python.packages."aiohttp"
    python.packages."arrow"
    python.packages."defusedxml"
    python.packages."frozendict"
    python.packages."jsonschema"
  ];
  checkPhase = ''
    export NO_TESTS_OVER_WIRE=1
    export PYTHONDONTWRITEBYTECODE=1

    flake8 src/
    py.test --cov=src -cov-report term-missing
    coverage html
  '';
}

Important to know here is that you instantiate all generated packages as python = import ./requirements.nix { inherit pkgs; }; which gives you a Python environment with all the packages generated by pypi2nix as well as some common utilities.

To create a package you use python.mkDerivation which works like the pythonPackages.buildPythonPackage function in nixpkgs. All generated packages are available as one attribute set under python.packages.

One of future goals of pypi2nix project is to also improve the UX of our Python tooling in nixpkgs. While this is very hard to do within nixpkgs it is almost trivial to experiment with this outside nixpkgs.

Convert generated requirements.nix into nixpkgs overlay

A working example is worth 1000 words.

overlay.nix:

self: super:
{
  customPython =
      (import ./requirements.nix { pkgs = self; });
}

shell.nix:

with (import <nixpkgs> { overlays = [ (import ./overlay.nix) ]; });
customPython.interpreter

More Repositories

1

home-manager

Manage a user environment using Nix [maintainer=@rycee]
Nix
6,566
star
2

awesome-nix

๐Ÿ˜Ž A curated list of the best resources in the Nix community [maintainer=@cyntheticfox]
2,869
star
3

disko

Declarative disk partitioning and formatting using nix [maintainer=@Lassulus]
Nix
1,487
star
4

nixos-generators

Collection of image builders [maintainer=@Lassulus]
Nix
1,338
star
5

nixvim

Configure Neovim with Nix! [maintainer=@GaetanLepage, @traxys, @mattsturgeon]
Nix
1,324
star
6

nixos-anywhere

install nixos everywhere via ssh [maintainer=@numtide]
Shell
1,242
star
7

NixOS-WSL

NixOS on WSL(2) [maintainer=@nzbr]
Nix
1,236
star
8

nix-direnv

A fast, persistent use_nix/use_flake implementation for direnv [maintainer=@Mic92 / @bbenne10]
Nix
1,170
star
9

nix-on-droid

Nix-enabled environment for your Android device. [maintainers=@t184256,@Gerschtli]
Nix
1,148
star
10

impermanence

Modules to help you handle persistent state on systems with ephemeral root storage [maintainer=@talyz]
Nix
1,084
star
11

dream2nix

Simplified nix packaging for various programming language ecosystems [maintainer=@DavHau]
Nix
906
star
12

NUR

Nix User Repository: User contributed nix packages [maintainer=@Mic92]
Python
882
star
13

comma

Comma runs software without installing it. [maintainers=@Artturin,@burke,@DavHau]
Rust
831
star
14

nix-index

Quickly locate nix packages with specific files [maintainers=@bennofs @figsoda @raitobezarius]
Rust
817
star
15

poetry2nix

Convert poetry projects to nix automagically [maintainer=@adisbladis,@cpcloud]
Nix
812
star
16

nixd

Nix language server, based on nix libraries [maintainer=@inclyc,@Aleksanaa]
C++
807
star
17

lanzaboote

Secure Boot for NixOS [maintainers=@blitz @raitobezarius @nikstur]
Rust
798
star
18

nix-init

Generate Nix packages from URLs with hash prefetching, dependency inference, license detection, and more [maintainer=@figsoda]
Rust
775
star
19

rnix-lsp

WIP Language Server for Nix! [maintainer=@aaronjanse]
Rust
698
star
20

naersk

Build Rust projects in Nix - no configuration, no code generation, no IFD, sandbox friendly.
Nix
680
star
21

lorri

Your projectโ€™s nix-env [maintainer=@Profpatsch,@nyarly]
Rust
659
star
22

nixGL

A wrapper tool for nix OpenGL application [maintainer=@guibou]
Nix
650
star
23

fenix

Rust toolchains and rust-analyzer nightly for Nix [maintainer=@figsoda]
Nix
601
star
24

robotnix

Build Android (AOSP) using Nix [maintainer=@danielfullmer,@Atemu]
Nix
591
star
25

plasma-manager

Manage KDE Plasma with Home Manager
Nix
575
star
26

nixpkgs-fmt

Nix code formatter for nixpkgs [maintainer=@zimbatm]
Rust
503
star
27

nixpkgs-wayland

Automated, pre-built packages for Wayland (sway/wlroots) tools for NixOS. [maintainers=@colemickens, @Artturin]
Nix
494
star
28

emacs-overlay

Bleeding edge emacs overlay [maintainer=@adisbladis]
Nix
484
star
29

vulnix

Vulnerability (CVE) scanner for Nix/NixOS.
Python
447
star
30

nixpkgs-update

Updating nixpkgs packages since 2018
Haskell
415
star
31

nurl

Generate Nix fetcher calls from repository URLs [maintainer=@figsoda]
Rust
411
star
32

nixos-vscode-server

Visual Studio Code Server support in NixOS
Nix
377
star
33

rnix-parser

A Nix parser written in Rust [maintainer=@oberblastmeister]
Nix
346
star
34

crate2nix

rebuild only changed crates in CI with crate2nix and nix
Nix
329
star
35

terraform-nixos

A set of Terraform modules that are designed to deploy NixOS [maintainer=@adrian-gierakowski]
HCL
323
star
36

srvos

NixOS profiles for servers [maintainer=@numtide]
Nix
297
star
37

neovim-nightly-overlay

[maintainer=@GaetanLepage, @willruggiano]
Nix
289
star
38

trustix

Trustix: Distributed trust and reproducibility tracking for binary caches [maintainer=@adisbladis]
Go
284
star
39

nixbox

NixOS Vagrant boxes [maintainer=@zimbatm]
HCL
276
star
40

vscode-nix-ide

Nix language support for VSCode editor [maintainer: @jnoortheen]
TypeScript
260
star
41

haumea

Filesystem-based module system for Nix [maintainer=@figsoda]
Nix
259
star
42

nix-user-chroot

Install & Run nix without root permissions [maintainer=@Mic92]
Rust
243
star
43

nix-index-database

Weekly updated nix-index database [maintainer=@Mic92]
Nix
237
star
44

dconf2nix

๐Ÿพ Convert dconf files (e.g. GNOME Shell) to Nix, as expected by Home Manager [maintainer=@jtojnar]
Nix
228
star
45

NixNG

A linux distribution based on Nix [maintainer=@MagicRB]
Nix
227
star
46

nix-zsh-completions

ZSH Completions for Nix
Shell
225
star
47

gomod2nix

Convert applications using Go modules to Nix expressions [maintainer=@adisbladis]
Nix
216
star
48

nix-melt

A ranger-like flake.lock viewer [maintainer=@figsoda]
Rust
202
star
49

noogle

https://noogle.dev - nix function exploring. [maintainer=@hsjobeki]
Nix
194
star
50

todomvc-nix

Example on how to nixify a project [maintainer=@Rizary]
Nix
169
star
51

pip2nix

Freeze pip-installable packages into Nix expressions [maintainer=@datakurre]
Python
168
star
52

flakelight

Framework for simplifying flake setup [maintainer=@accelbread]
Nix
159
star
53

tree-sitter-nix

Nix grammar for tree-sitter [maintainer=@cstrahan]
JavaScript
158
star
54

nix-environments

Repository to maintain out-of-tree shell.nix files (maintainer=@mic92)
Nix
156
star
55

kickstart-nix.nvim

โ„๏ธ A dead simple Nix flake template repository for Neovim derivations [maintainer=@mrcjkb]
Lua
142
star
56

nix-eval-jobs

Parallel nix evaluator with a streamable json output [maintainers @Mic92, @adisbladis]
C++
140
star
57

docker-nixpkgs

docker images from nixpkgs [maintainer=@zimbatm]
Nix
137
star
58

nix-ld-rs

Run unpatched dynamic binaries on NixOS [maintainer=@zhaofengli @Mic92]
Rust
137
star
59

linuxkit-nix

An easy to use Linux builder for macOS [maintainer=@nicknovitski]
Nix
133
star
60

nix-vscode-extensions

Nix expressions for VSCode and OpenVSX extensions [maintainers: @deemp, @AmeerTaweel]
Haskell
132
star
61

npmlock2nix

nixify npm based packages [maintainer=@andir]
Nix
130
star
62

nixago

Generate configuration files using Nix [maintainer=@jmgilman]
Nix
125
star
63

nixos-install-scripts

collection of one-shot scripts to install NixOS on various server hosters and other hardware. [maintainer=@happysalada]
Shell
124
star
64

yarn2nix

Generate nix expressions from a yarn.lock file [maintainer=???]
Nix
123
star
65

nixdoc

Tool to generate documentation for Nix library functions [maintainer=@infinisil]
Nix
119
star
66

dns.nix

A Nix DSL for DNS zone files [maintainers=@raitobezarius @kirelagin @Tom-Hubrecht]
Nix
116
star
67

nixpkgs-lint

A fast semantic linter for Nix using tree-sitter ๐ŸŒณ + โ„๏ธ. [maintainers=@Artturin,@siraben]
Rust
108
star
68

nix-unstable-installer

A place to host Nix unstable releases [maintainer=@lilyinstarlight]
Ruby
105
star
69

wiki

Nixos wiki [maintainer=@samueldr]
103
star
70

go-nix

Elements of Nix re-implemented as Go libraries [maintainer=@flokli]
Go
102
star
71

pyproject.nix

A collection of Nix utilities to work with Python projects [maintainer=@adisbladis]
Nix
101
star
72

namaka

Snapshot testing for Nix based on haumea [maintainer=@figsoda]
Rust
100
star
73

nur-combined

A repository of NUR that combines all repositories [maintainer=@Mic92]
Nix
92
star
74

napalm

Support for building npm packages in Nix and lightweight npm registry [maintainer @jtojnar]
Nix
91
star
75

nixos-images

Automatically build (netboot) images for NixOS [maintainer=@Mic92]
Nix
90
star
76

vgo2nix

Convert go.mod files to nixpkgs buildGoPackage compatible deps.nix files [maintainer=@adisbladis]
Nix
89
star
77

nixt

Simple unit-testing for Nix [maintainer=@Lord-Valen]
TypeScript
87
star
78

nur-packages-template

A template for NUR repositories: [maintainer=@fgaz]
Nix
84
star
79

pnpm2nix

Load pnpm lock files into nix :) [maintainer=@adisbladis]
Nix
81
star
80

mineflake

Declarative Minecraft server in NixOS [unmaintained]
Rust
75
star
81

nix-github-actions

A library to turn Nix Flake attribute sets into Github Actions matrices [maintainer=@adisbladis]
Nix
75
star
82

buildbot-nix

A nixos module to make buildbot a proper Nix-CI [maintainer=@Mic92]
Python
74
star
83

infra

nix-community infrastructure [maintainer=@Mic92]
Nix
74
star
84

nix-data-science

Standard set of packages and overlays for data-scientists [maintainer=@tbenst]
Nix
72
star
85

kde2nix

Provisional, experimental Plasma 6 (and friends) pre-release packaging [maintainer=@K900]
Nix
67
star
86

nixpkgs.lib

nixpkgs lib for cheap instantiation [maintainer=@github-action] (with initial help from @blaggacao)
Nix
66
star
87

ethereum.nix

Nix packages and NixOS modules for the Ethereum ecosystem. [maintainers=@aldoborrero,@brianmcgee,@selfuryon]
Nix
65
star
88

setup.nix

Nixpkgs based build tools for declarative Python packages [maintainer=@datakurre]
Nix
64
star
89

hydra-check

check hydra for the build status of a package [maintainer=@makefu,@Artturin]
Python
63
star
90

nix-installers

Nix installers for legacy distributions (rpm & deb & pacman) [maintainer=@adisbladis]
Nix
62
star
91

zon2nix

Convert the dependencies in `build.zig.zon` to a Nix expression [maintainer=@figsoda]
Zig
62
star
92

nix-unit

Unit testing for Nix code [maintainer=@adisbladis]
C++
60
star
93

redoxpkgs

Cross-compile to Redox using Nix [maintainer=@aaronjanse]
Nix
52
star
94

patsh

A command-line tool for patching shell scripts inspired by resholve [maintainer=@figsoda]
Rust
46
star
95

nix-ts-mode

An Emacs major mode for editing Nix expressions, powered by tree-sitter [maintainer=@remi-gelinas]
Emacs Lisp
46
star
96

mavenix

Deterministic Maven builds using Nix [maintainer=@icetan]
Nix
45
star
97

nixpkgs-pytools

Tools for removing the tedious nature of creating nixpkgs derivations [maintainer=@costrouc]
Python
44
star
98

docker-nix

Docker image for nix [maintainer=@zimbatm] [status=deprecated]
Dockerfile
38
star
99

builtwithnix.org

Share the love of Nix [maintainer=@zimbatm]
HTML
37
star
100

nix4vscode

[WIP]
Rust
36
star