codenamephp/installer

使用模板文件夹设置项目的安装程序,例如从 GitHub 模板仓库

2.0.0 2024-01-07 14:10 UTC

This package is auto-updated.

Last update: 2024-09-14 12:34:25 UTC


README

Packagist Version Packagist PHP Version Support Lines of code GitHub code size in bytes CI Packagist Downloads GitHub

使用模板文件夹设置项目的安装程序,例如从 GitHub 模板仓库

安装

最简单的方法是通过 composer。只需在您的命令行中运行 composer require codenamephp/installer,它将为您安装最新版本。

用法

想法是在子文件夹中有一个启动脚本。脚本本身仅设置安装程序和依赖项,从而也设置了安装程序实际上执行的内容。将其放入自己的文件夹的原因是使文件与其它文件明确分离,以便安装程序可以轻松删除自己。

首先使用 composer 引入安装程序包,这样我们就可以开始使用其类。

最佳实践是创建一个 .installer 文件夹和一个 install.php 文件。以下示例将渲染 .installer/templates 文件夹中的文件到父文件夹中,替换所有现有文件,并用数组中的变量替换模板中的所有变量。一旦完成,将删除 .installer 文件夹。

路径中也有变量替换。在这个例子中,使用了一个框架替换器,所以常见的文件夹名称也可能作为变量出现,不会意外替换(如这个例子中的“vendor”)。前缀和后缀的默认值是 '__',因此如果存在文件 .installer/templates/files/__vendor__/__componentName__.json,它将变成 files/codenamephp/some.component.json,这样您就可以动态地更改最终结构(例如,有一个与您的命名空间匹配的文件夹结构)。

.installer/install.php:

use de\codenamephp\installer\StepExecutor;
use de\codenamephp\installer\steps\CopyTemplateFolder;
use de\codenamephp\installer\steps\CreateFolders;
use de\codenamephp\installer\steps\DeleteFilesAndFolders;
use de\codenamephp\installer\steps\SequentialCollection;
use de\codenamephp\installer\templateCopy\directoryHandler\CreateDirectoryWithSymfonyFilesystem;
use de\codenamephp\installer\templateCopy\fileHandler\RenderWithTwigAndDumpWithSymfonyFilesystem;
use de\codenamephp\installer\templateCopy\variableReplacer\FramedStringReplace;
use Symfony\Component\Filesystem\Filesystem;
use Twig\Environment;
use Twig\Loader\FilesystemLoader;

return call_user_func(static function() {
  require_once __DIR__ . '/../vendor/autoload.php';
  
  $filesystem = new Filesystem();
  $variableReplacer = new FramedStringReplace();
  $componentName = basename(trim(shell_exec("git config --get remote.origin.url")), '.git');
  $variables = [
            'vendor' => 'codenamephp',
            'componentName' => $componentName,
            'namespace' => implode('\\', array_merge(['de', 'codenamephp'], explode('.', $componentName)))
          ];
          
  (new StepExecutor(
    new SequentialCollection(
      new CopyTemplateFolder(
        new \de\codenamephp\installer\templateCopy\RecursiveIterator(
          new CreateDirectoryWithSymfonyFilesystem($filesystem,$variableReplacer),
          new RenderWithTwigAndDumpWithSymfonyFilesystem($filesystem, $variableReplacer, new Environment(new FilesystemLoader('/', '/')))
        ),
        __DIR__ . '/templates',
        dirname(__DIR__),
        $variables
      ),
      new CreateFolders($variableReplacer, $filesystem, [dirname(__DIR__) . '/src'], $variables),
      new DeleteFilesAndFolders($variableReplacer, $filesystem, [__DIR__], $variables),
    )
  ))->run();
});

.installer/templates/composer.json:

{
  "name": "{{vendor}}/{{componentName}}",
  "description": "",
  "type": "library",
  "license": "Apache-2.0",
  "require": {
    "php": "^8.0"
  },
  "require-dev": {
    "dealerdirect/phpcodesniffer-composer-installer": "^0.7",
    "phpcompatibility/php-compatibility": "^9.0",
    "squizlabs/php_codesniffer": "^3.5",
    "mikey179/vfsstream": "^1.6.8"
  },
  "autoload": {
    "psr-4": {
      "{{namespace|replace({'\\':'\\\\'})}}\\": [
        "src"
      ]
    }
  },
  "autoload-dev": {
    "psr-4": {
      "{{namespace|replace({'\\':'\\\\'})}}\\test\\": [
        "test"
      ]
    }
  }
}

.installer/templates/README.md:

# {{componentName}}

![Packagist Version](https://img.shields.io/packagist/v/{{vendor}}/{{componentName}})
![Packagist PHP Version Support](https://img.shields.io/packagist/php-v/{{vendor}}/{{componentName}})
![Lines of code](https://img.shields.io/tokei/lines/github/{{vendor}}/{{componentName}})
![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/{{vendor}}/{{componentName}})
![CI](https://github.com/{{vendor}}/{{componentName}}/workflows/CI/badge.svg)
![Packagist Downloads](https://img.shields.io/packagist/dt/{{vendor}}/{{componentName}})
![GitHub](https://img.shields.io/github/license/{{vendor}}/{{componentName}})

## Installation

Easiest way is via composer. Just run `composer require {{vendor}}/{{componentName}}` in your cli which should install the latest version for you.

## Usage

此示例可以是 GitHub 模板仓库的一部分。在 GitHub 上创建存储库后,可以将存储库克隆到本地,然后运行 composer install && php .installer/install.php && composer update,存储库即可用于开发。

此示例可以根据存储库需求进行修改。由于安装程序本身只执行自定义步骤,因此可以在存储库中通过实现 \de\codenamephp\installer\steps\iStep 接口并添加到安装程序中添加自定义步骤。