Exclude package in Go nix.flake

I’m trying to create a flake.nix for https://github.com/benchkram/bob. To create it I used the #go-hello package with:

nix flake new -t templates#go-hello .

So far the file is looking like this:

{
  description = "A build system for microservices";


  # Nixpkgs / NixOS version to use.
  inputs.nixpkgs.url = "nixpkgs/nixos-21.11";

  outputs = { self, nixpkgs }:
    let

      # to work with older version of flakes
      lastModifiedDate = self.lastModifiedDate or self.lastModified or "19700101";


      # System types to support.
      supportedSystems = [ "x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin" ];

      # Helper function to generate an attrset '{ x86_64-linux = f "x86_64-linux"; ... }'.
      forAllSystems = nixpkgs.lib.genAttrs supportedSystems;

      # Nixpkgs instantiated for supported system types.
      nixpkgsFor = forAllSystems (system: import nixpkgs { inherit system; });

    in
    {

      # Provide some binary packages for selected system types.
      packages = forAllSystems (system:
        let
          pkgs = nixpkgsFor.${system};
        in
        {
          go-hello = pkgs.buildGoModule {
            pname = "bob";
            version = "0.5.3";

            # In 'nix develop', we don't need a copy of the source tree
            # in the Nix store.
            src = ./.;

            # This hash locks the dependencies of this package. It is
            # necessary because of how Go requires network access to resolve
            # VCS.  See https://www.tweag.io/blog/2021-03-04-gomod2nix/ for
            # details. Normally one can build with a fake sha256 and rely on native Go
            # mechanisms to tell you what the hash should be or determine what
            # it should be "out-of-band" with other tooling (eg. gomod2nix).
            # To begin with it is recommended to set this, but one must
            # remeber to bump this hash when your dependencies change.
            #vendorSha256 = pkgs.lib.fakeSha256;

            vendorSha256 = "sha256-ZP4wzsAzwDz+86N8IUQLsWsHCg8pmyGnL6x+FOe372U=";

            excludedPackages = [ "example/server-db" "test/e2e" "tui-example" ];
          };
        });

      # The default package for 'nix build'. This makes sense if the
      # flake provides only one package or there is a clear "main"
      # package.
      defaultPackage = forAllSystems (system: self.packages.${system}.go-hello);
    };
}

As you can see, I’m trying to exclude some packages because nix build fails with:

 main module (github.com/benchkram/bob) does not contain package github.com/benchkram/bob/example/server-db

However, excludedPackages doesn’t seem to work because I get the same error when running nix build.

I’m curious why excludedPackages doesn’t work . For a nix expression I wrote, excludedPackages worked fine and I assumed that since I’m using the same buildGoModule function should here as well.

My guess: It is not available in 21.11. I tried your expression using 22.05 and I get a different error than before, looks like failing tests:

❯ nix build path:$(pwd)
error: builder for '/nix/store/62kv1ga5xqrylqcpv75pvxd8nr0y2n8k-bob-0.5.3.drv' failed with exit code 1;
       last 10 log lines:
       > github.com/benchkram/bob/bob.CreatePlayground({{0xc0003d56b0, 0x24}, {0x0, 0x0}, {0x0, 0x0}, {0x0, 0x0}})
       > 	github.com/benchkram/bob/bob/playground.go:162 +0x40a
       > github.com/benchkram/bob/bob.TestEmptyProjectName(0x407f79)
       > 	github.com/benchkram/bob/bob/aggregate_test.go:196 +0x226
       > testing.tRunner(0xc000102820, 0x14644f8)
       > 	testing/testing.go:1259 +0x102
       > created by testing.(*T).Run
       > 	testing/testing.go:1306 +0x35a
       > FAIL	github.com/benchkram/bob/bob	0.021s
       > FAIL
       For full logs, run 'nix log /nix/store/62kv1ga5xqrylqcpv75pvxd8nr0y2n8k-bob-0.5.3.drv'.
1 Like

Thanks @NobbZ!,

Updating to inputs.nixpkgs.url= "nixpkgs/nixos-22.05" with a combination of doCheck = false; seems that it does the trick. Thanks!

Here is the working flake:

{
  description = "A build system for microservices";
  inputs.nixpkgs.url = "nixpkgs/nixos-22.05";

  outputs = { self, nixpkgs }:
    let
      # to work with older version of flakes
      lastModifiedDate = self.lastModifiedDate or self.lastModified or "19700101";
      # System types to support.
      supportedSystems = [ "x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin" ];

      # Helper function to generate an attrset '{ x86_64-linux = f "x86_64-linux"; ... }'.
      forAllSystems = nixpkgs.lib.genAttrs supportedSystems;

      # Nixpkgs instantiated for supported system types.
      nixpkgsFor = forAllSystems (system: import nixpkgs { inherit system; });
    in
    {

      # Provide some binary packages for selected system types.
      packages = forAllSystems (system:
        let
            pkgs = nixpkgs.legacyPackages.${system};
        in
        {
          go-hello = pkgs.buildGoModule {
            pname = "bob";
            version = "0.5.3";

            # In 'nix develop', we don't need a copy of the source tree
            # in the Nix store.
            src = ./.;

            # This hash locks the dependencies of this package. It is
            # necessary because of how Go requires network access to resolve
            # VCS.  See https://www.tweag.io/blog/2021-03-04-gomod2nix/ for
            # details. Normally one can build with a fake sha256 and rely on native Go
            # mechanisms to tell you what the hash should be or determine what
            # it should be "out-of-band" with other tooling (eg. gomod2nix).
            # To begin with it is recommended to set this, but one must
            # remeber to bump this hash when your dependencies change.
            #vendorSha256 = pkgs.lib.fakeSha256;
            vendorSha256 = "sha256-ZP4wzsAzwDz+86N8IUQLsWsHCg8pmyGnL6x+FOe372U=";

            excludedPackages = [ "example/server-db" "test/e2e" "tui-example" ];

            doCheck = false;
          };
        });

      # The default package for 'nix build'. This makes sense if the
      # flake provides only one package or there is a clear "main"
      # package.
      defaultPackage = forAllSystems (system: self.packages.${system}.go-hello);
    };
}