brunonatali / install
为仓库提供安装能力。
Requires
- php: >=7.3
- brunonatali/tools: >=0.4
Requires (Dev)
- phpunit/phpunit: ^9
README
为仓库提供安装能力。
目录
开始前
在开始之前,请考虑审查您的代码,并理解这是一个用于在Linux环境中自动化安装PHP应用程序的工具。
注意,如果已安装服务,此组件将更新.service文件并执行daemon-reload,如果在安装开始之前已激活(运行),则在安装完成后将自动启动服务。
注意:Windows上不支持。
文件夹结构
请按照以下结构准备文件夹:
+-- installation | +-- install.php | +-- install-instructions.json +-- pbin | +-- my_program_executable +-- src | +-- YourClass.php +-- post-install | +-- myScript.sh +-- composer.json
注意:如果您不确定如何创建“my_program_executable”,请转到可执行程序。
快速入门示例
个人
常见用途是单个应用程序的安装,为此,请考虑使用如下所示的文件夹结构。
- 让我们创建一个简单的配置文件,“installation/install-instructions.json”。
{ "sys-bin-files" : [ "my_program_executable" ], "service" : [ { "name" : "My1stProgram", "bin" : "my_program_executable", "control-by-pid" : true, "restart-on-abort" : true } ], "require" : [ "program1", "program2" ], "post-installation" : "/../post-install/myScript.sh" }
- 让我们添加一个自动安装的脚本“installation/install.php”。
use BrunoNatali\Install\Factory; $myApp = new Factory( ["dir" => __DIR__] ); $myApp->install();
- 最后执行安装。
$ php vendor/myname/appname/installation/install.php
这将使“pbin”文件夹的内容变为可执行,同时在系统上创建一个名为“My1stProgram”的服务,该服务将执行文件“my_program_executable”。
最后将调用位于/post-install下的myScript.sh脚本,以执行一些必要的调整,例如调用其他应用程序、更改某些文件属性或删除。了解更多
“require”是一个数组,它告诉您的应用程序依赖于哪些应用程序。
注意,在“/usr/sbin”中创建了一个符号链接,这样您就可以在终端中通过键入来运行应用程序。
$ my_program_executable
所有应用
在此示例中,假设您打算安装的所有应用程序中均创建了如代码“Folder structure”中所示的结构,并且至少创建了配置文件“install-instructions.json”。
在Factory类中有一个静态函数,可以轻松安装多个应用程序。
\BrunoNatali\Install\Factory::installAll()
执行所有应用程序安装的最简单、最直接的方法是在终端上运行以下命令:
$ sudo php -r "require 'vendor/autoload.php'; \BrunoNatali\Install\Factory::installAll();"
可以跳过某些应用程序的安装(部分或全部)。
为此,您需要传递一个包含应用程序名称的键的数组,如下所示:
/** * Installation will be made in basic mode, no services or post scripts * are done in this mode */ \BrunoNatali\Install\Factory::installAll( null, array( 'appToNotInstall' => true // Don`t metter the value ) ); /** * Installation will be entirely skipped */ \BrunoNatali\Install\Factory::installAll( null, array( 'appToNotInstall' => 'force' // Set value to 'force' ) );
注意:需要以root身份运行,因为它将与systemd交互并在系统中创建/更新进程。
可执行程序
此工具考虑的可执行程序基本上包含以下内容:
#!/usr/bin/php <?php require __DIR__ . '/../../../autoload.php'; use VendorName\AppName\Service; $myService = new Service(); $myService->start();
安装后脚本
您可以创建一个bash脚本来在安装后运行。目前,此脚本可以执行任何操作。
为了帮助本地化,已添加环境变量'INSTALL_DIR'。
#!/bin/bash echo "Installing from: $INSTALL_DIR"; $ Installing from: /opt/myapp/vendor/vendor-name/rep-name/installation
使用pid文件
可以配置为使用pid文件来控制服务。
为此,在服务配置中放置一个“control-by-pid”。
"service" : [ { "name" : "MyApp", "bin" : "my_app_executable", "control-by-pid" : true } ]
当启动时,在\var\run\MyApp.pid中创建一个pid文件,当停止时删除。
选择要使用的shell
为了帮助使用所有配置来加载/运行服务,在执行时调用linux shell,并使用“sh”作为默认。
仅允许一个配置,要更改此设置,请在服务配置中放置一个“shell”并设置为“bash”。
"service" : [ { "name" : "MyApp", "bin" : "my_app_executable", "shell" : "bash" } ]
失败时重启
如果服务失败,Systemd可以重启服务。
为此,在服务配置中放置“restart-on-abort”。
"service" : [ { "name" : "MyApp", "bin" : "my_app_executable", "restart-on-abort" : true } ]
杀死子进程
将“kill-child”设置为false将使Systemd在停止/重启时让主进程的所有子进程保持存活。
为此,在服务配置中放置“kill-child”。
"service" : [ { "name" : "MyApp", "bin" : "my_app_executable", "kill-child" : false } ]
请记得手动杀死所有剩余进程,以防止系统内存溢出。
需要应用
在config.json中设置“require”,可以指定应用程序所依赖的应用。
例如,如果你有一个名为“myCar”的应用程序,你可以设置“require”,如下所示:
{ "require" : [ "engine", "wheelsNtires" ] }
这样,安装时会先安装“engine”和“wheelsNtires”,然后再安装“myCar”。
注意1. 当从BrunoNatali\Install\Factory::installAll()调用时,这将被自动处理。
要手动处理,必须在install()中传递'require-installed'。
/** * engine.php */ use BrunoNatali\Install\Factory; $myApp = new Factory( ["dir" => __DIR__] ); $myApp->install();
/** * wheelsNtires.php */ use BrunoNatali\Install\Factory; $myApp = new Factory( ["dir" => __DIR__] ); $myApp->install();
/** * car.php */ use BrunoNatali\Install\Factory; $myApp = new Factory( ["dir" => __DIR__] ); $myApp->install( array( 'require-installed' => array( "engine" => '', // See note 2 "wheelsNtires" => true, "stuff" => 'ok' ) ));
注意2. 在上述示例中,无论'require-installed'项的值是什么(除了保留的'force'之外),只需将其注册为一个键即可。
需要服务
配置systemd.unit 'Requires'以定义服务。
{ "service" : [ { "require-service" : "require-this.service" } ] }
服务后
配置systemd.unit 'After'特定服务。
{ "service" : [ { "exec-only-after" : "after-this.service" } ] }
安装
推荐通过Composer安装此库。你是Composer的新手吗?
本项目遵循SemVer。这将安装最新支持的版本。
$ composer require brunonatali/install:^1.0
本项目旨在在Linux上运行,因此不需要任何PHP扩展,但实际上尚未在所有环境中测试。如果您发现任何错误,请报告。
许可证
MIT,请参阅LICENSE文件。