Skip to main content

Новая страница

Отличная задача! Действительно, неудобно хранить один и тот же скрипт во многих проектах. Вот несколько проверенных решений:

## 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.php (кладешь в корень каждого проекта):

<?php  
$dumperUrl = 'https://raw.githubusercontent.com/yourname/php-dumper/main/dump\_project.php';  
$localPath = \_\_DIR\_\_ . '/dump\_project\_temp.php';

// Загружаем последнюю версию  
$content = file\_get\_contents($dumperUrl);  
if ($content === false) {  
 die("Не удалось загрузить дампер\\n");  
}

// Проверяем хэш для кэширования (опционально)  
$cacheFile = \_\_DIR\_\_ . '/.dumper\_cache';  
if (file\_exists($cacheFile) && md5($content) === file\_get\_contents($cacheFile)) {  
 // Используем существующий  
 require\_once \_\_DIR\_\_ . '/dump\_project.php';  
 exit;  
}

// Сохраняем и запускаем  
file\_put\_contents($localPath, $content);  
file\_put\_contents($cacheFile, md5($content));

require\_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.php  

Или добавьте глобальный bin в PATH и вызывайте откуда угодно:

dump-project /path/to/project  

## 4. **Bash-скрипт-обертка (простой вариант)**

Создайте скрипт на сервере:

### /usr/local/bin/dump-project:

\#!/bin/bash  
DUMPER\_REPO="https://raw.githubusercontent.com/yourname/php-dumper/main/dump\_project.php"  
TEMP\_DUMPER="/tmp/dump\_project\_$$.php"

\# Скачиваем последнюю версию  
curl -s "$DUMPER\_REPO" > "$TEMP\_DUMPER"

\# Запускаем в контексте целевого проекта  
cd "$1" || exit 1  
php "$TEMP\_DUMPER"

\# Чистим  
rm "$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.php dump\_project.php  

Для обновления всех проектов:

git submodule update --remote  

## **Рекомендации:**

1. **Для командной разработки** → **Composer** (проще всего управлять версиями)
2. **Для личного использования** → **Глобальный composer-пакет + симлинки**
3. **Если нет доступа к composer** → **Bash-скрипт с curl**

## **Продвинутый вариант с кэшированием:**

// dump\_runner.php  
<?php  
class DumpRunner {  
 private $repoUrl = 'https://api.github.com/repos/yourname/dump-tool/contents/dump\_project.php';  
 private $cacheFile;  
 private $localScript;  
   
 public function \_\_construct($projectRoot) {  
 $this->cacheFile = $projectRoot . '/.dumper\_meta.json';  
 $this->localScript = $projectRoot . '/dump\_project.php';  
 }  
   
 public function run() {  
 if ($this->needUpdate()) {  
 $this->downloadLatest();  
 }  
 require\_once $this->localScript;  
 }  
   
 private function needUpdate() {  
 if (!file\_exists($this->localScript)) return true;  
   
 // Проверяем SHA файла через GitHub API  
 $ch = curl\_init("$this->repoUrl?ref=main");  
 curl\_setopt($ch, CURLOPT\_RETURNTRANSFER, true);  
 curl\_setopt($ch, CURLOPT\_USERAGENT, 'DumpRunner');  
 $response = json\_decode(curl\_exec($ch), true);  
   
 $currentSha = file\_exists($this->cacheFile) ?   
 json\_decode(file\_get\_contents($this->cacheFile))->sha : null;  
   
 return $currentSha !== $response\['sha'\];  
 }  
}

$runner = new DumpRunner(\_\_DIR\_\_);  
$runner->run();  

**Итог**: Лично я рекомендую **Composer + bin** — это стандарт в PHP-мире, легко обновляется через composer update, и все разработчики поймут этот подход.