【问题标题】:Get package install path from composer script / composer API从作曲家脚本/作曲家 API 获取包安装路径
【发布时间】:2014-11-28 18:39:13
【问题描述】:

从 Composer 安装此软件包后,我想复制位于该软件包中的一些文件。

实际上,我希望在从 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 类(在参数中提供)获取已安装/更新包的安装目录吗?

注意:

我试过$event->getOperation()->getPackage->targetDir(),但这并没有提供安装路径,而是targetDir of the package, defined in composer.json

【问题讨论】:

    标签: composer-php


    【解决方案1】:

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

    理论答案:

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

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

    于是我切换到 post-install-cmd 和 post-update-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"
            ]
    }
    

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

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

    【讨论】:

    • 非常感谢您发布此内容,我已经搜索了几天试图整理 Composer API 文档。
    • 不必安装包,您可以使用 Studio (github.com/franzliedke/studio) 从文件系统加载哑包。
    猜你喜欢
    • 2018-01-22
    • 2013-05-26
    • 2014-02-26
    • 1970-01-01
    • 2018-10-21
    • 2017-10-17
    • 2021-08-07
    • 2017-09-15
    • 2023-03-03
    相关资源
    最近更新 更多