svanderburg/composer2nix

生成用于构建PHP composer包的Nix表达式

v0.0.6 2022-03-01 23:41 UTC

This package is not auto-updated.

Last update: 2024-09-29 04:09:00 UTC


README

composer2nix 是一个工具,可用于生成PHP Nix 表达式,以便使用 composer 包。

Nix 集成使得使用Nix包管理器(而不是composer)部署PHP包及其所有依赖项成为可能。

此外,生成的Nix composer包支持将PHP应用程序方便地集成到NixOS服务中,例如NixOS的Apache HTTP服务。

先决条件

此包需要安装以下包

$ nix-env -f '<nixpkgs>' -iA nix-prefetch-scripts

请参考Nix文档以获取详细的安装说明。

安装

此包可以使用 composer 和Nix包管理器进行安装。要使用composer安装,请运行

$ composer global require svanderburg/composer2nix

要使用Nix安装此包,请克隆Git仓库并运行

$ nix-env -f release.nix -iA package.x86_64-linux

构建开发版本

可以通过检出Git仓库并运行来部署开发版本

$ nix-env -f release.nix -iA package.x86_64-linux

上述命令将开发版本的 composer2nix 可执行文件安装到用户的Nix配置中。

或者,您可以直接使用 composer 来安装项目依赖项

$ composer install

使用方法

您需要一个提供 composer.json 和(如果适用)composer.lock 配置文件的项目。

运行以下命令可从composer配置文件生成Nix表达式

$ composer2nix

上述命令生成三个表达式:包含依赖项的 php-packages.nix、构建基础设施的 composer-env.nix 以及可以用来从依赖项组合包的 default.nix

运行以下命令行指令使用Nix部署包及其依赖项

$ nix-build

部署Web应用程序项目

我们可以使用 composer2nix 自动化部署Web应用程序项目,作为NixOS配置的一部分。

例如,我们可以创建以下简单的PHP Web应用程序(index.php),该程序使用 dompdf 库将HTML页面生成PDF文件

<?php
require 'vendor/autoload.php';

use Dompdf\Dompdf;

$dompdf = new Dompdf();
$dompdf->loadHtml('hello world');

$dompdf->setPaper('A4', 'landscape');
$dompdf->render();

$dompdf->stream();
?>

我们可以编写以下 composer.json 配置文件来配置 dompdf 依赖项

{
    "name": "exampleapp/exampleapp",

    "require": {
        "dompdf/dompdf": "^0.8.0"
    }
}

使用以下命令可以让 composer 部署依赖项(并在 composer.lock 文件中指定使用的版本)

$ composer install

或者,我们也可以使用 composer2nix

$ composer2nix

上述命令生成可以用来部署Web应用程序及其依赖项的Nix表达式。

我们可以使用Nix构建包含其依赖项的Web应用程序包

$ nix-build
$ ls result/
index.php  vendor/

(如观察到的,vendor/ 文件夹包含所有依赖项的工件)。

我们可以在NixOS配置中将生成的包附加到Apache服务器的文档根目录

{pkgs, config, ...}:

let
  myexampleapp = import /home/sander/myexampleapp {
    inherit pkgs;
  };
in
{
  time.timeZone = "UTC";

  services.httpd = {
    enable = true;
    adminAddr = "admin@localhost";
    enablePHP = true;
    documentRoot = myexampleapp;
  };

  ...
}

以下是如何部署上述NixOS配置

$ nixos-rebuild switch

如果上述命令成功执行,则我们有一个正在运行的系统,其中Apache网络服务器正在为我们提供Web应用程序。

部署命令行工具项目

除了Web应用程序之外,我们还可以部署用PHP实现的命令行工具项目。

例如,对于composer2nix项目,我们可以通过添加--executable参数来生成特定于CLI的表达式

$ composer2nix --executable

我们可以通过以下命令在我们的Nix配置文件中安装composer2nix可执行文件

$ nix-env -f default.nix -i

部署第三方最终用户包

除了部署开发项目外,我们可能还希望部署第三方最终用户包,通常是命令行工具。

我们可以使用composer2nix从Packagist上的第三方包自动生成表达式,例如phpunit

$ composer2nix -p phpunit/phpunit

生成表达式后,我们可以通过以下命令在我们的Nix配置文件中部署phpunit

$ nix-env -f default.nix -iA phpunit-phpunit

安装Nix包后,我们应该能够运行

$ phpunit --version

默认情况下,composer2nix会尝试下载包的最新版本。我们还可以添加一个参数来指定我们想要使用的版本

$ composer2nix -p phpunit/phpunit --package-version 6.2.0

上述命令行指令部署了phpunit6.2.0版本。

--package-version参数支持composer支持的任何版本指定器,包括版本范围。

高级功能

composer2nix支持一些不太常用的高级功能。

禁用开发依赖的部署

默认情况下,composer(因此也包括composer2nix)将包括所有开发依赖。然而,在生产环境中,通常希望排除它们以减少磁盘空间消耗和部署时间。

通过覆盖表达式(例如,创建一个名为override.nix的文件)并附加noDev = true;参数,我们可以禁用开发依赖

{pkgs ? import <nixpkgs> {
  inherit system;
}, system ? builtins.currentSystem}:

let
  phpPackage = import ./default.nix {
    inherit pkgs system;
    noDev = true; # Disable development dependencies
  };
in
phpPackage

我们可以使用以下命令行指令部署上述包

$ nix-build override.nix

删除composer工件

默认情况下,使用Nix部署composer包时,它还会将composer配置文件(composer.jsoncomposer.lock)包含在包中。

然而,对于生产场景,例如部署Web应用程序,通常不需要这些文件。也有可能删除这些composer配置文件

{pkgs ? import <nixpkgs> {
  inherit system;
}, system ? builtins.currentSystem}:

let
  phpPackage = import ./default.nix {
    inherit pkgs system;
  };
in
phpPackage.override {
  removeComposerArtifacts = true; # Remove composer configuration files
}

运行安装后说明

对于某些包,我们可能希望在打包过程完成后运行额外的命令行指令,例如运行单元测试。

通过创建一个覆盖Nix表达式来调用生成的构建函数并提供一个postInstall钩子,我们可以指定要运行的额外命令行指令

{pkgs ? import <nixpkgs> {
  inherit system;
}, system ? builtins.currentSystem}:

let
  phpPackage = import ./default.nix {
    inherit pkgs system;
  };
in
phpPackage.override {
  postInstall = ''
    php vendor/bin/phpunit tests
  '';
}

在上面的代码片段中,我们调用phpunit来运行所有我们的单元测试。

添加未指定的依赖项

某些包可能还需要非PHP包依赖项。由于这些依赖项没有在composer配置文件中指定,它们的部署在Nix构建环境中通常会失败,因为这些依赖项不能隐式找到。

通过覆盖生成的包表达式,我们可以自行提供这些缺失的依赖项

{pkgs ? import <nixpkgs> {
  inherit system;
}, system ? builtins.currentSystem}:

let
  phpPackage = import ./default.nix {
    inherit pkgs system;
  };
in
phpPackage.override {
  buildInputs = [ pkgs.graphviz ];
  postInstall = ''
    php vendor/bin/phpdocumentor -d src -t out
  '';
}

上述表达式通过提供graphviz作为额外依赖项覆盖了生成的PHP包。这个包特别有用,当你想要使用phpdocumentor时,因为它使用graphviz来生成类图。如果这个工具在构建环境中不存在,类图将不会生成。

符号链接依赖项

默认情况下,composer2nix会复制所有最终进入vendor/文件夹的包。这是默认选项,因为一些包加载了相对于其解析位置的autoload.php,例如phpunit,如果依赖项是符号链接,则可能无法正常工作。

也可以选择将所有依赖项符号链接而不是复制,这会使部署更快、更节省空间。

$ composer2nix --symlink-dependencies

限制

此工具仍处于原型阶段。因此,可能存在一些问题。此外,目前完全不支持化石库。

许可证

本软件包的内容受MIT许可证保护。