Новая страница
Отличная задача! Действительно, неудобно хранить один и тот же скрипт во многих проектах. Вот несколько проверенных решений:
##
1. **Через Composer (рекомендуемый способ)**
Создайте отдельный composer-пакет для вашего скрипта.
###
Структура пакета:
your-dump-tool/
├── composer.json
├── bin/
│ └── dump-project # исполняемый скрипт
└── src/
└── Dumper.php
###
composer.json:
{
"name": "your-vendor/dump-tool",
"type": "composer-plugin", // или просто "library"
"bin": \["bin/dump-project"\],
"require": {
"php": ">>=7.4"
},
"autoload": {
"psr-4": {
"YourVendor\\\\DumpTool\\\\": "src/"
}
}
}
###
Установка в проектах:
composer require --dev your-vendor/dump-tool
После этого скрипт будет доступен в vendor/bin/dump-project
###
Запуск:
php vendor/bin/dump-project
\# или если добавить в composer.json проекта:
composer dump-project
##
2. **Через GitHub + автообновление**автообновление
Создайте репозиторий на GitHub, а в проектах используйте **скрипт-загрузчик**загрузчик:
###
load\_dumper.load_dumper.php (кладешь в корень каждого проекта):
<<?php
$dumperUrl = 'https://raw.githubusercontent.com/yourname/php-dumper/main/dump\_project.dump_project.php';
$localPath = \_\_DIR\_\___DIR__ . '/dump\_project\_temp.dump_project_temp.php';
// Загружаем последнюю версию
$content = file\_get\_contents(file_get_contents($dumperUrl);
if ($content === false) {
die("Не удалось загрузить дампер\\n");
}
// Проверяем хэш для кэширования (опционально)
$cacheFile = \_\_DIR\_\___DIR__ . '/.dumper\_cache'dumper_cache';
if (file\_exists(file_exists($cacheFile) && md5($content) === file\_get\_contents(file_get_contents($cacheFile)) {
// Используем существующий
require\_oncerequire_once \_\_DIR\_\___DIR__ . '/dump\_project.dump_project.php';
exit;
}
// Сохраняем и запускаем
file\_put\_contents(file_put_contents($localPath, $content);
file\_put\_contents(file_put_contents($cacheFile, md5($content));
require\_oncerequire_once $localPath;
// Не забываем удалить после выполнения
unlink($localPath);
##
3. **Глобальный composer-пакет**пакет
Установите скрипт глобально на сервере:
composer global require your-vendor/dump-tool
А в каждом проекте создайте символическую ссылку:
ln -s ~/.composer/vendor/bin/dump-project /path/to/project/dump\_project.dump_project.php
Или добавьте глобальный bin в PATH и вызывайте откуда угодно:
dump-project /path/to/project
##
4. **Bash-скрипт-обертка (простой вариант)**
Создайте скрипт на сервере:
###
/usr/local/bin/dump-project:
\#!/bin/bash
DUMPER\_REPO=DUMPER_REPO="https://raw.githubusercontent.com/yourname/php-dumper/main/dump\_project.dump_project.php"
TEMP\_DUMPER=TEMP_DUMPER="/tmp/dump\_project\_$dump_project_$$.php"
\# Скачиваем последнюю версию
curl -s "$DUMPER\_REPO"DUMPER_REPO" >> "$TEMP\_DUMPER"TEMP_DUMPER"
\# Запускаем в контексте целевого проекта
cd "$1" || exit 1
php "$TEMP\_DUMPER"TEMP_DUMPER"
\# Чистим
rm "$TEMP\_DUMPER"TEMP_DUMPER"
Использование:
dump-project /path/to/project
##
5. **Git submodule (если скрипт часто меняется)**
cd /path/to/project
git submodule add https://github.com/yourname/dump-tool.git tools/dump-tool
ln -s tools/dump-tool/dump\_project.dump_project.php dump\_project.dump_project.php
Для обновления всех проектов:
git submodule update --remote
##
Рекомендации:
- Для командной
разработки**разработки →**Composer**Composer (проще всего управлять версиями) - Для личного
использования**использования →**Глобальный composer-пакет +симлинки**
симлинки - Если нет доступа к
composer**composer →**Bash-скрипт сcurl**curl
1. **
##
Продвинутый вариант с кэшированием:**
// dump\_runner.dump_runner.php
<<?php
class DumpRunner {
private $repoUrl = 'https://api.github.com/repos/yourname/dump-tool/contents/dump\_project.dump_project.php';
private $cacheFile;
private $localScript;
public function \_\_construct(__construct($projectRoot) {
$this->>cacheFile = $projectRoot . '/.dumper\_meta.dumper_meta.json';
$this->>localScript = $projectRoot . '/dump\_project.dump_project.php';
}
public function run() {
if ($this->>needUpdate()) {
$this->>downloadLatest();
}
require\_oncerequire_once $this->>localScript;
}
private function needUpdate() {
if (!file\_exists(file_exists($this->>localScript)) return true;
// Проверяем SHA файла через GitHub API
$ch = curl\_init(curl_init("$this->>repoUrl?ref=main");
curl\_setopt(curl_setopt($ch, CURLOPT\_RETURNTRANSFER,CURLOPT_RETURNTRANSFER, true);
curl\_setopt(curl_setopt($ch, CURLOPT\_USERAGENT,CURLOPT_USERAGENT, 'DumpRunner');
$response = json\_decode(curl\_exec(json_decode(curl_exec($ch), true);
$currentSha = file\_exists(file_exists($this->>cacheFile) ?
json\_decode(file\_get\_contents(json_decode(file_get_contents($this->>cacheFile))->>sha : null;
return $currentSha !== $response\[response['sha'\];
}
}
$runner = new DumpRunner(\_\_DIR\_\_)__DIR__);
$runner->>run();
**Итог**Итог: Лично я рекомендую **Composer + bin**bin — это стандарт в PHP-мире, легко обновляется через composer update, и все разработчики поймут этот подход.