代码之家  ›  专栏  ›  技术社区  ›  leymannx

如何强制编写器脚本加载本地类而不是全局类

  •  1
  • leymannx  · 技术社区  · 7 年前

    未定义的方法

    (相关文件链接在我问题的底部。)

    我让作曲家写了一些 post-install-cmd post-update-cmd 脚本。在我的脚本中,我想利用 readlink() 函数来自 symfony/filesystem /vendor 文件夹中有 3.4

    use Symfony\Component\Filesystem\Filesystem; 在我档案的最上面。

    但每当我跑的时候:

    $fs = new Filesystem();
    $path = '/path/to/some/symlink';
    if ($fs->readlink($path)) {
      // code
    }
    

    出现以下错误,告诉我调用的是未定义的方法:

    PHP致命错误:未捕获错误:调用未定义的方法

    好的,所以我在我的项目的 文件夹。这种方法是存在的。我的IDE指向我。但当我跑的时候:

    $fs = new Filesystem();
    get_class_methods($fs);
    

    它试图从哪个文件加载方法?

    好的,我试着检查它从哪个文件加载这个类:

    $fs = new Filesystem();
    $a = new \ReflectionClass($fs);
    echo $a->getFileName();
    

    phar:///usr/local/Cellar/composer/1.7.2/bin/composer/vendor/symfony/filesystem/Filesystem.php 但为什么呢?为什么它要从我的苹果地窖里拿走包裹?真奇怪。

    但好吧,我认为这是一个自制的问题,并卸载了自制作曲家 $ brew uninstall --force composer 然后又安装了一次,就像上面记录的那样 https://getcomposer.org/doc/00-intro.md#globally .

    但现在都一样了。

    $a=新的\ReflectionClass($fs);
    

    phar:///usr/local/bin/composer/vendor/symfony/filesystem/Filesystem.php .

    还有什么?

    $PATH 包含 /Users/leymannx/.composer/vendor/bin /usr/local/bin /usr/bin /bin /usr/sbin /sbin /Users/leymannx/.composer/vendor/bin 只返回 /usr/local/bin /usr/bin /bin /usr/sbin /sbin

    我还尝试在我的 composer.json . 还是一样:

    "optimize-autoloader": true,
    "classmap-authoritative": true,
    "vendor-dir": "vendor/",
    

    我终于在GitHub上创建了一个问题: https://github.com/composer/composer/issues/7708


    1 回复  |  直到 7 年前
        1
  •  1
  •   rob006    7 年前

    这是运行代码的上下文问题。如果你直接在 post-install-cmd 它将在作曲家的过程中执行。这意味着它将共享绑定在 composer.phar Symfony\Component\Filesystem\Filesystem 在这种情况下。

    您可以通过在单独的进程中运行脚本来绕过此问题。你可以创造 post-install-cmd.php 所有引导(如需要)的文件 vendor/autoload.php 安装后命令 挂钩:

    "scripts": {
        "post-install-cmd": [
            "php post-install-cmd.php"
        ]
    },