2014-11-28 3 views
3

Я хотел бы скопировать файл, расположенный внутри пакета после того, как я установил этот пакет из Composer.Получить путь установки пакета из композитора/API-интерфейса композитора

На самом деле, я хотел бы, чтобы после установки или обновления пакета из Composer скопируйте файл, который может находиться внутри загруженного пакета в другой каталог. Я использую scripts с командой post-package-install и post-package-update, но не могу найти путь установки.

Это мой текущий сценарий:

use Composer\Script\PackageEvent; 

class MyScript { 

public static function copyFiles(PackageEvent $event) 
{ 
    $package = $event->getOperation()->getPackage(); 

    $originDir = $package->someFunctionToFind(); #Here, I should retrieve the install dir 

    if (file_exists($originDir) && is_dir($originDir)) { 
     //copy files from $originDir to a new location 
    } 

} 
} 

ли кто-нибудь знает, как получить установку дир установленной/обновленный пакет из класса PackageEvent (который предусмотрен в параметре)?

Примечание:

I судимого $event->getOperation()->getPackage->targetDir(), но это не дает пути установки, но targetDir of the package, defined in composer.json

ответ

3

я мог бы получить путь установки с помощью метода Composer\Installation\InstallationManager::getInstallPath.

Theoric Ответ:

use Composer\Script\PackageEvent; 

class MyScript { 

public static function copyFiles(PackageEvent $event) 
{ 
    $package = $event->getOperation()->getPackage(); 
    $installationManager = $event->getComposer()->getInstallationManager(); 

    $originDir = $installationManager->getInstallPath($package); 

    if (file_exists($originDir) && is_dir($originDir)) { 
     //copy files from $originDir to a new location 
    } 

} 
} 

Но этот ответ theoric, потому что я не мог найти soluce отлаживать свой код на самом деле не устанавливая пакет (который был болезненным: я должен удалить пакет, и переустановите его, чтобы проверить мой код).

Так я переключаюсь на послеустановочным-CMD и после обновления-CMD, и мой пришел стали:

use Composer\Script\CommandEvent; #the event is different ! 

class MyScript { 

public static function copyFiles(CommandEvent $event) 
{ 
    // wet get ALL installed packages 
    $packages = $event->getComposer()->getRepositoryManager() 
      ->getLocalRepository()->getPackages(); 
    $installationManager = $event->getComposer()->getInstallationManager(); 

    foreach ($packages as $package) { 
     $installPath = $installationManager->getInstallPath($package); 
     //do my process here 
    } 
} 
} 

Не забудьте добавить команду composer.json:

"scripts": { 

     "post-install-cmd": [ 
      "MyScript::copyFiles" 
     ], 
     "post-update-cmd": [ 
      "MyScript::copyFiles" 
     ] 
} 

Чтобы отладить код, мне пришлось запустить run-script composer.phar post-install-cmd.

ПРИМЕЧАНИЕ: этот код должен работать с psr4. Для psr0 может потребоваться добавить $ package-> targetDir(), чтобы получить правильный путь установки. Не стесняйтесь комментировать или улучшать свой ответ.

+0

Большое спасибо за публикацию этого, я целый день искал поиски документов API Composer API. –

Смежные вопросы