Convert applications using Go modules to Nix expressions
Find a file
= 5d387097aa fix: ensure executor doesn't deadlock when closure errors
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.
2024-10-20 20:19:25 +02:00
.assets Add logos and acknowledgements of project sponsors 2022-08-25 23:07:29 +12:00
.github chore: fix CI 2024-10-20 11:21:45 +02:00
builder chore: fix CI 2024-10-20 11:21:45 +02:00
docs docs(nix-reference): update docs to include additional parameters 2024-08-04 18:12:55 -04:00
internal fix: ensure executor doesn't deadlock when closure errors 2024-10-20 20:19:25 +02:00
templates/app Call templates/app/shell.nix without buildGoApplication 2023-09-23 22:13:09 +01:00
tests Add test for repo using vendored modules 2022-08-24 15:01:08 +08:00
.envrc Add python test script 2020-12-03 16:23:39 +01:00
.gitignore fix: ensure executor doesn't deadlock when closure errors 2024-10-20 20:19:25 +02:00
.mergify.yml add mergify 2023-11-14 09:18:28 +01:00
default.nix Remove generic builder expression 2022-09-02 16:14:39 +12:00
flake.lock use flake-utils input and also override it in the template 2023-09-13 08:44:51 +02:00
flake.nix Fix: add back darwin support 2024-07-29 10:48:15 -05:00
go.mod build(deps): bump golang.org/x/mod from 0.14.0 to 0.21.0 2024-10-20 17:57:35 +00:00
go.sum build(deps): bump golang.org/x/mod from 0.14.0 to 0.21.0 2024-10-20 17:57:35 +00:00
gomod2nix.toml chore: bump gomod2nix.toml 2024-10-20 17:57:35 +00:00
LICENSE Add README file 2020-12-03 16:23:39 +01:00
main.go Change package name from github.com/tweag/gomod2nix to github.com/nix-community/gomod2nix 2022-08-28 06:33:04 +12:00
overlay.nix Merge pull request #116 from doronbehar/exposeVendor 2023-11-14 09:05:47 +01:00
README.md Add clarification about Gomod2nix and it's relationship to Trustix 2022-08-25 23:10:07 +12:00
shell.nix expose flake interface that does not rely on overlays 2023-09-13 08:24:13 +02:00

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 Commissions Next Generation Internet programme through the NGI Zero PET (privacy and trust enhancing technologies) fund.

NGI0 logo NLNet banner Tweag logo