从作曲家脚本/作曲家 API 获取包安装路径


我想

在从 Composer 安装此软件包后复制位于软件包中的一些文件。

实际上,我希望在从Composer安装或更新软件包后,将下载的软件包中的一些文件复制到另一个目录。我使用脚本,以及安装后和包后更新命令,但我找不到如何获取安装路径。

这是我目前的脚本:

use ComposerScriptPackageEvent;
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 类(在参数中提供)获取已安装/更新的软件包的安装 dir?

注意:

我尝试了$event->getOperation()->getPackage->targetDir()但这不提供安装路径,而是提供包的目标Dir,在composer.json中定义

我可以使用 Composer\Installation\InstallationManager::getInstallPath 方法获取安装路径。

理论答案:

use ComposerScriptPackageEvent;
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
    } 
}
}

但是这个答案是理论上的,因为我找不到一个解决方案来调试我的代码而不真正安装一个包(这很痛苦:我应该删除一个包,然后重新安装它来检查我的代码)。

所以我切换到 post-install-cmd 和 post-update-cmd,我的来变成了:

use ComposerScriptCommandEvent; #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"
        ]
}

为了调试代码,我必须运行composer.phar run-script post-install-cmd。

注意:此代码应该适用于PSR4。对于 psr0,可能需要添加 $package->targetDir() 才能获得正确的安装路径。随时评论或改进我的答案。

相关内容

  • 没有找到相关文章

最新更新