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.load_dumper.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\_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" &gt;> "$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

##

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

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

    1. **

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

    curl
  6. ##

**

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

// 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**bin — это стандарт в PHP-мире, легко обновляется через composer update, и все разработчики поймут этот подход.