What's the best value to add in the name attribute?

The flake bellow:

{
  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";

      version = "0.5.3";
      # 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";


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

            CGO_ENABLED = 0;

            ldflags = [ "-s" "-w" "-X main.Version=${version}" ];

            # 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);
    };
}

fails with:

error: attribute 'name' missing for call to 'derivationStrict'

at //builtin/derivation.nix:9:12:

The issue was introduced when I added version = "0.5.3"; for some reason. Before, nix build worked OK. It looks like if I add a name to the buildGoModule attr set, the issue is fixed again.

{
  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";

      version = "0.5.3";
      # 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";
            name = "bob${version}";

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

            CGO_ENABLED = 0;

            ldflags = [ "-s" "-w" "-X main.Version=${version}" ];

            # 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);
    };
}

I have 2 questions:

  1. I’m curios why this is happening? Why adding the version changes the behaviour?
  2. What’s the best value to be added in the name field?

For background: I’m trying to build a flake for https://github.com/benchkram/bob

Nix’s derivation primitive expects a name attribute passed to it – that’s the error you are seeing.

Now you can either pass name directly to stdenv.mkDerivation (used internally by buildGoModule) and mkDerivation will pass it down to derivation, or you can pass it both pname and version and mkDerivation will build the name for you. But you must pass both, or name will not be defined:

1 Like