【问题标题】:Composer not autoloading files included through repositories > type > path作曲家不自动加载通过存储库>类型>路径包含的文件
【发布时间】:2016-08-11 09:56:06
【问题描述】:

问题

我有两个 PSR-4 作曲家项目,我希望从一个类到另一个类,文件结构如下:

projectfoo
-public
--index.php
-src
--CompanyName
---Foo
----Foo.php
-composer.json
projectbar
-src
--CompanyName
---Bar
----Bar.php
-composer.json

composer.json 文件为 projectfoo 定义为(注意 repositories > type > path 依赖):

{
    "name": "companyname/foo",
    "require": {
        "companyname/bar": "*"
    },
    "repositories": [
        {
            "type": "path",
            "url": "../projectbar"
        }
    ],
    "autoload": {
        "psr-4": {
            "CompanyName\\": "src/CompanyName"
        }
    }
}

和项目栏为:

{
    "name": "companyname/bar",
    "version": "1.0.0",
    "autoload": {
        "psr-4": {
            "CompanyName\\": "src/CompanyName"
        }
    }
}

运行 composer update 正确生成包含 companyname/foo 文件夹的供应商文件夹。

在 projectfoo 中的 index.php 我有:

require_once '../vendor/autoload.php';

$bar = new \CompanyName\Bar\Bar();

但是,当运行 \CompanyName\Bar\Bar 时未定义。


问题

为什么Bar 没有包含在 autoload.php 文件中?


我尝试过的

  • 使用以下方法刷新自动加载文件: composer install composer update composer dump-autoload
  • 将供应商名称 CompanyName 更改为其他名称。
  • 查看vendor\composer 文件夹中的installed.json 文件,bar 项目被列为:

#

{
    "name": "companyname/bar",
    "version": "1.0.0",
    "version_normalized": "1.0.0.0",
    "dist": {
        "type": "path",
        "url": "../companyname/bar",
        "reference": "f35ed0ad82c8280db9b603712dd256074f99e196",
        "shasum": null
    },
    "type": "library",
    "installation-source": "dist",
    "autoload": {
        "psr-4": {
            "CompanyName\\": "src/CompanyName",
        }
    }
}
  • 奇怪的是,当将 autoload.php 文件引导到 phpunit 时,文件会正确自动加载,并且在我的测试类中可用。

【问题讨论】:

    标签: php namespaces composer-php autoload


    【解决方案1】:

    问题围绕着作曲家使用符号链接链接“路径”项目的方式。


    总之

    因为我是在 Windows 系统上开发并在 Ubuntu vagrant box 上执行代码,所以在 windows 上设置的符号链接在运行 composer install 时会解析到盒子内的损坏路径。这也解释了为什么在 windows 上运行的测试能够找到Bar,但在虚拟框中却没有运行。


    解决方案

    为了解决这个问题,我最初强制作曲家镜像项目而不是对其进行符号链接,但是,这仍然会导致供应商文件夹中的符号链接出现问题。

    我现在已经开始将我的库托管在单独的存储库中,并使用运行良好的 "type": "vcs" 标记导入它们。 Composer 还会在进行新提交时处理更新包,而在使用带有镜像的 "type": "path" 标记时不会发生这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 2014-08-15
      • 2016-08-13
      • 1970-01-01
      • 2018-03-30
      • 2021-12-18
      • 2015-12-24
      相关资源
      最近更新 更多