Skip to main content

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

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

## 1. **Через Composer (рекомендуемый способ)**

Создайте отдельный composer-пакет для вашего скрипта.

### Структура пакета:
```

your-dump-tool/
├── composer.json
├── bin/
│ └── dump-project # исполняемый скрипт
└── src/
  └── Dumper.php
```

### `composer.json`json:
```json

{
  "name": "your-vendor/dump-tool",
  "type": "composer-plugin", // или просто "library"
  "bin": \["bin/dump-project"\],
  "require": {
  "php": ">>=7.4"
  },
  "autoload": {
  "psr-4": {
  "YourVendor\\\\DumpTool\\\\": "src/"
  }
  }
}
```

### Установка в проектах:
```bash

composer require --dev your-vendor/dump-tool
```

После этого скрипт будет доступен в `vendor/bin/dump-project`project

### Запуск:
```bash

php vendor/bin/dump-project
\# или если добавить в composer.json проекта:
composer dump-project
```

## 2. **Через GitHub + автообновление**

Создайте репозиторий на GitHub, а в проектах используйте **скрипт-загрузчик**:

### `load_dumper.php`load\_dumper.php (кладешь в корень каждого проекта):
```php
<

&lt;?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) &amp;&amp; md5($content) === file_get_contents(file\_get\_contents($cacheFile)) {
  // Используем существующий
require\_once require_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-пакет**

Установите скрипт глобально на сервере:

```bash

composer global require your-vendor/dump-tool
```

А в каждом проекте создайте символическую ссылку:
```bash

ln -s ~/.composer/vendor/bin/dump-project /path/to/project/dump_project.dump\_project.php
```

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

dump-project /path/to/project
```

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

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

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

\#!/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" >&gt; "$TEMP_DUMPER"

TEMP\_DUMPER"

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

TEMP\_DUMPER"

\# Чистим
rm "$TEMP_DUMPER"
```

TEMP\_DUMPER"

Использование:
```bash

dump-project /path/to/project
```

## 5. **Git submodule (если скрипт часто меняется)**

```bash

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
```

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

git submodule update --remote
```

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

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

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

```php

// dump_runner.dump\_runner.php
< &lt;?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->&gt;cacheFile = $projectRoot . '/.dumper_meta.dumper\_meta.json';
  $this->&gt;localScript = $projectRoot . '/dump_project.dump\_project.php';
  }
    
  public function run() {
  if ($this->&gt;needUpdate()) {
  $this->&gt;downloadLatest();
  }
      require_oncerequire\_once $this->&gt;localScript;
  }
    
  private function needUpdate() {
  if (!file_exists(file\_exists($this->&gt;localScript)) return true;
        
  // Проверяем SHA файла через GitHub API
  $ch = curl_init(curl\_init("$this->&gt;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->&gt;cacheFile) ?
                      json_decode(file_get_contents(json\_decode(file\_get\_contents($this->&gt;cacheFile))->&gt;sha : null;
        
  return $currentSha !== $response[response\['sha'\];
  }
}

$runner = new DumpRunner(__DIR__)\_\_DIR\_\_);
$runner->&gt;run();
```

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