6

我有这个 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,无论检查服务器/版本,还是寻找更优雅的解决方案,每次都必须自动加载这个本地供应商文件夹,因为我是 Composer 的新手。

4

2 回答 2

2

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

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

如果您想了解更多详细信息,我可以对此进行扩展,我已经设置了许多满意的软件包,并且效果非常好。(请注意,我还没有试用过新的商业 Toran Proxy。)

2. 如果你的 'imaqtpie' 库是一个假的供应商库(听起来你只是有一些文件存储在那里,就像你想要一个老式的包含库一样?),那么你可以简单地使用一个类映射来指向从您的顶级应用程序自动加载到该文件夹​​。仅当您将该文件夹包含在顶级应用程序中时,这才有意义。

因此,您的应用程序的 composer 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(用于转储自动加载的源)。但理论上你可以从顶层应用程序加载任何你想要的东西,因此你可以将一个包“硬编码”到供应商库和它的类路径中。

我可能建议要这样做!供应商文件夹是一个脆弱的位置,大多数人和程序都认为可以随心所欲地销毁和重建。因此,存放任何不在包裹中的东西都是一个危险的地方。对于任何其他假设相同的开发人员来说,这也是令人困惑的。

所以我建议将你的库移动到远离供应商文件夹的另一个位置,例如'lib',然后使用上面的类路径方法将它包含在自动加载器中。

于 2015-04-05T09:30:09.603 回答
2

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

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

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

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

于 2014-08-22T07:47:30.660 回答