svanderburg / composer2nix
生成用于构建PHP composer包的Nix表达式
Requires
- svanderburg/pndp: 0.0.4
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包管理器
- Nix预取脚本。可以从Nix包中运行安装
$ 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
上述命令行指令部署了phpunit
的6.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.json
和composer.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许可证保护。