mirror of
https://github.com/tweag/gomod2nix.git
synced 2024-11-21 20:55:00 +00:00
Convert applications using Go modules to Nix expressions
5d387097aa
When running 'gomod2nix' on in my project, the 'gomod2nix import' was failing for every import. I have more imports than the default maxJobs. This caused a deadlock and the program never finished. This is because in the erroring case, we send to the errChan, which is a blocking channel. If this blocks then the defers are never called, most importantly the `defer` which pulls an entry off the semaphore (e.guard). This means once the erroring work functions exceeds the numWorkers, we will block trying to acquire the semaphore when we call .Add with more work. We never get to the point where we call .Wait(), which would drain the errChan becuase we are blocked on the semaphore whilst we are still generating work. This change moves the semaphore acquire to within the goroutines themselves. This alters the behaviour in that we now will start as many goroutines as we have work items, but the work they do will still be gated by the semaphore. This is reasonable behaviour: goroutines are cheap, in general this package is useful if the work the functions are doing is expensive not the goroutine creation itself. The work still is guarded by the semaphore. There is also a regression test added and in passing, the spelling of Parallel is corrected. |
||
---|---|---|
.assets | ||
.github | ||
builder | ||
docs | ||
internal | ||
templates/app | ||
tests | ||
.envrc | ||
.gitignore | ||
.mergify.yml | ||
default.nix | ||
flake.lock | ||
flake.nix | ||
go.mod | ||
go.sum | ||
gomod2nix.toml | ||
LICENSE | ||
main.go | ||
overlay.nix | ||
README.md | ||
shell.nix |
Gomod2nix
Convert applications using Go modules -> Nix
Usage
From the Go project directory execute:
$ gomod2nix
This will create gomod2nix.toml
that's used like so
let
pkgs = import <nixpkgs> {
overlays = [
(self: super: {
buildGoApplication = super.callPackage ./builder { };
})
];
};
in pkgs.buildGoApplication {
pname = "gomod2nix-example";
version = "0.1";
src = ./.;
modules = ./gomod2nix.toml;
}
For more in-depth usage check the Getting Started and the Nix API reference docs.
Motivation
The announcement blog post contains comparisons with other Go build systems for Nix and additional notes on the design choices made.
License
This project is licensed under the MIT License. See the LICENSE file for details.
About the project
The developmentent of Trustix (which Gomod2nix is a part of) has been sponsored by Tweag I/O and funded by the NLNet foundation and the European Commission’s Next Generation Internet programme through the NGI Zero PET (privacy and trust enhancing technologies) fund.