فا نیکسی

Go

ساخت ماژول‌های Go با buildGoModule

تابع buildGoModule برنامه‌های Go مدیریت‌شده با ماژول‌های Go را می‌سازد. این تابع Go Modules را طی یک ساخت دو مرحله‌ای می‌سازد:

  • یک derivation دریافت‌کننده (fetcher) میانی به نام goModules. این derivation برای دریافت تمامی وابستگی‌های ماژول Go استفاده خواهد شد.
{
  pet = buildGoModule (finalAttrs: {
    pname = "pet";
    version = "0.3.4";

    src = fetchFromGitHub {
      owner = "knqyf263";
      repo = "pet";
      tag = "v${finalAttrs.version}";
      hash = "sha256-Gjw1dRrgM8D3G7v6WIM2+50r4HmTXvx0Xxme2fH9TlQ=";
    };

    vendorHash = "sha256-ciBIR+a1oaYH+H1PcC8cD8ncfJczk1IiJ8iYNM+R6aA=";

    meta = {
      description = "Simple command-line snippet manager, written in Go";
      homepage = "https://github.com/knqyf263/pet";
      license = lib.licenses.mit;
      maintainers = with lib.maintainers; [ kalbasit ];
    };
  });
}

صفات buildGoModule

بسیاری از صفات کنترل‌کننده فاز ساخت توسط buildGoModule پشتیبانی می‌شوند. توجه داشته باشید که buildGoModule صفات زیر را هنگام ساخت درایویشن با خروجی ثابت vendor/ goModules نیز می‌خواند:

cd path/to/nixpkgs
nix-prefetch -E "{ sha256 }: ((import ./. { }).my-package.overrideAttrs { vendorHash = sha256; }).goModules"

می‌توان vendorHash را با overrideAttrs بازنشانی کرد. نمونه بالا را به این شکل بازنشانی کنید:

{
  pet_0_4_0 = pet.overrideAttrs (
    finalAttrs: previousAttrs: {
      version = "0.4.0";
      src = fetchFromGitHub {
        inherit (previousAttrs.src) owner repo;
        tag = "v${finalAttrs.version}";
        hash = "sha256-gVTpzmXekQxGMucDKskGi+e+34nJwwsXwvQTjRO6Gdg=";
      };
      vendorHash = "sha256-dUvp7FEW09V0xMuhewPGw3TuAic/sD7xyXEYviZ2Ivs=";
    }
  );
}

proxyVendor

اگر true باشد، دریافت‌کنندهٔ واسط به جای وندور کردن (vendoring) وابستگی‌ها، آن‌ها را از Go module proxy

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

tags

یک فهرست رشته‌ای از تگ‌های ساخت Go (که محدودیت‌های ساخت نیز نامیده می‌شوند) که از طریق آرگومان -tags مربوط به go build پاس داده می‌شوند. این محدودیت‌ها کنترل می‌کنند که آیا فایل‌های Go از کد منبع باید در ساخت گنجانده شوند یا خیر. برای مثال:

{
  tags = [
    "production"
    "sqlite"
  ];
}

برچسب‌ها را نیز می‌توان به‌صورت شرطی تنظیم کرد:

{ tags = [ "production" ] ++ lib.optionals withSqlite [ "sqlite" ]; }

deleteVendor

اگر روی true تنظیم شود، پوشه vendor از‌پیش‌موجود را حذف می‌کند. این گزینه تنها باید زمانی استفاده شود که وابستگی‌های موجود در پوشه vendor خراب یا ناقص باشند.

subPackages

به صورت یک رشته یا لیستی از رشته‌ها مشخص می‌شود. سازنده را از ساخت بسته‌های فرزندی که فهرست نشده‌اند محدود می‌کند. اگر subPackages مشخص نشود، تمامی بسته‌های فرزند ساخته خواهند شد.

بسیاری از پروژه‌های Go بسته اصلی را در پوشه cmd نگه می‌دارند. مثال زیر می‌تواند تنها برای ساخت باینری‌های example-cli و example-server استفاده شود:

{
  subPackages = [
    "cmd/example-cli"
    "cmd/example-server"
  ];
}

excludedPackages

به صورت یک رشته یا فهرستی از رشته‌ها مشخص می‌شود. باعث می‌شود سازنده (Builder) از ساخت بسته‌های فرزندی که با هر یک از مقادیر ارائه‌شده مطابقت دارند، صرف‌نظر کند.

enableParallelBuilding

اینکه آیا ساخت‌ها و تست‌ها باید به صورت

{
  pet-overridden = pet.overrideAttrs (
    finalAttrs: previousAttrs: {
      passthru = previousAttrs.passthru // {
        # If the original package has an `overrideModAttrs` attribute set, you'd
        # want to extend it, and not replace it. Hence we use
        # `lib.composeExtensions`. If you are sure the `overrideModAttrs` of the
        # original package trivially does nothing, you can safely replace it
        # with your own by not using `lib.composeExtensions`.
        overrideModAttrs = lib.composeExtensions previousAttrs.passthru.overrideModAttrs (
          finalModAttrs: previousModAttrs: {
            # goModules-specific overriding goes here
            postBuild = ''
              # Here you have access to the `vendor` directory.
              substituteInPlace vendor/github.com/example/repo/file.go \
                --replace-fail "panic(err)" ""
            '';
          }
        );
      };
    }
  );
}

-Name_Resolution) و os/user را ببینید. توجه داشته باشید که تصمیم درباره اینکه آیا این بسته‌ها باید از پیاده‌سازی بومی Go استفاده کنند یا خیر را می‌توان در سطح هر

{
  buildInputs = [
    libvirt
    libxml2
  ];
}

مقدار پیش‌فرض env.CGO_ENABLED برابر با 1 است.

صرف‌نظر کردن از تست‌ها

{
  # -run and -skip accept regular expressions
  checkFlags = [ "-run=^Test(Simple|Fast)$" ];
}

اگر باید تعداد بیشتری از تست‌ها نادیده گرفته شوند، می‌توان از الگوی زیر استفاده کرد:

{
  checkFlags =
    let
      # Skip tests that require network access
      skippedTests = [
        "TestNetwork"
        "TestDatabase/with_mysql" # exclude only the subtest
        "TestIntegration"
      ];
    in
    [ "-skip=^${builtins.concatStringsSep "$|^" skippedTests}$" ];
}

برای غیرفعال کردن کامل تست‌ها، doCheck = false; را تنظیم کنید.

مهاجرت از buildGoPackage به buildGoModule

هشدار

buildGoPackage برای انتشار