如何使用Composer加载我自己的供应商文件夹?

时间:2013-07-25 02:50:17

标签: php composer-php

我有这个composer.json文件

{
    "require": {
        "filp/whoops": "1.*"
    }
}

但是,我有一个名为vendor/imaqtpie/framework/src的项目文件夹。这不是托管在任何地方,所以如果我composer update更新自动加载文件,则会出错。

The requested package "imaqtpie/framework" could not be found in any version, there may be a typo in package name.

我必须将自己添加到自动加载文件中才能使其正常工作。

'Framework' => array($vendorDir . '/imaqtpie/framework/src')

有什么方法可以解决这个问题吗?

我想告诉Composer这个本地供应商文件夹必须每次都自动加载,无论是检查服务器/版本,还是寻找更优雅的解决方案,因为我不是作曲家。

2 个答案:

答案 0 :(得分:2)

您必须使用包代码创建自己的本地git存储库才能实现这一点。 之后,将这样的内容放入 composer.json 文件中。

"repositories": [
    {
        "type":"vcs",
        "url":"/path/to/your/source"
    }
],

"require":{
    "filp/whoops":"dev-master"
}

如果以这种方式实现自动加载应该不是问题......

答案 1 :(得分:0)

有几种方法可以做到这一点。

1。 我说最正确的方法是托管它并使用Satis来生成一个私有的'packagist'。然后作曲家将表现“正常”并获得最新版本,进行版本检查等,但你说你不关心这个。

如果您想了解更多细节,我可以对此进行扩展,我已经设置了许多令人满意的套餐,并且效果非常好。 (注意还有新的商业Toran代理,我还没有试过。)

2。 如果你的'imaqtpie'库是一个虚假的供应商库(听起来你只是有一些文件存放在那里,就像你的老式包含库一样?),那么你可以简单地使用一个类图将自动加载器指向顶级应用程序中的该文件夹。只有在顶级应用中包含该文件夹时才有意义。

所以你的应用程序的作曲家json看起来像:

{
    "require": {
        "filp/whoops": "1.*"
    },
    "autoload": {
       "classmap":[
           "vendor/imaqtpie/framework/src"
       ]
    }
}

因此,这告诉作曲家该文件夹中有一堆类。当您运行composer dump-autoload时,它会扫描该文件夹并生成vendor/composer/autoload_classmap.php并列出您的所有文件。

这不是你应该如何使用作曲家,但你不是要求使用作曲家进行包管理,你问的是如何使用作曲家的自动加载器,我猜这很好!只要你了解风险。

3。 如果您的软件包是PSR0或4(听起来可能来自“src”文件夹),那么您也可以在顶级应用程序中执行此操作:

{
    "require": {
        "filp/whoops": "1.*"
    },
    "autoload": {
       "psr-4":{
           "Imaqtpie\\Framework\\":"vendor/imaqtpie/framework/src"
       ]
    }
}

这又有点奇怪,但应该有效!

通常,您在包的 composer.json中指定此路径,然后在进行更新时,它会合并到您的composer.lock,然后vendor/composer/installed.json(这是用于dump-autoload的源代码。但从理论上讲,您可以从顶级应用程序加载任何您想要的内容,因此您可以将软件包“硬编码”到供应商库和类路径中。

我可能会建议这样做!供应商文件夹是一个脆弱的位置,大多数人和程序可以假设可以随意销毁和重建。所以存放任何不在包装中的东西都是一个危险的地方。对于任何其他开发人员而言,这也是令人困惑的。

因此,我建议您将库移至远离供应商文件夹的其他位置,例如'lib',然后使用上面的类路径方法将其包含在自动加载器中。