brunonatali/install

为仓库提供安装能力。

v1.4 2021-02-09 15:05 UTC

This package is auto-updated.

Last update: 2024-09-09 22:27:10 UTC


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文件