首页 > 解决方案 > 当外部存储库不再存在时,Composer/Laravel 从现有文件安装包

问题描述

我有以下问题:我有一个使用 Laravel 4.2、PHP 5.5.9 和 Composer 的旧项目。我正在尝试在另一台计算机上设置它(使用 Laravel 4.2.2 和 PHP 5.6),但是其中一个必需的包有一个缺少的依赖项,因为管理该 GitHub 帐户的人决定删除它。因此,无法通过 Composer 安装所需的包。

现在,旧项目已经下载了这些包,我可以手动复制它们。我不知道的是如何以这种方式正确地将它们添加到项目中并阻止作曲家尝试重新下载它们。

没有代码示例,因为不需要。

标签: phpcomposer-phpphp-5.6laravel-4.2

解决方案


如果您有这些文件,并且您将无法继续使用 composer 来管理该包(例如,用于更新、删除等),那么您只需将这些文件视为属于您的项目。

如果不了解您要使用的包的更多信息,很难为您提供具体信息,但一般方法是:

假设您要使用的包是funtastic/foobar. 如果您有旧文件中的文件vendor,我们只需要 中的目录vendor/funtastic,它可能被称为foobar.

首先,在项目中复制文件。由于它们与您的应用程序的其余部分属于不同的命名空间,因此我个人不会将它们放在src. 例如,您可以将它们放在一个名为 的新目录lib中。

所以现在你的文件结构将是这样的:

project-root-dir
├── public
│  └── index.php
├── vendor/
├── lib/
│  └── foobar/
│     └── some files ...
│     └── src/
├── composer.json
├── composer.lock

现在您需要检查包的composer.json,特别是该autoload部分。它可能会这样说:

"autoload": {
        "psr-4": { "Funtastic\\FooBar\\": "src" }
    }

您现在需要转到应用程序的 composer.json,找到该autoload部分并对其进行编辑,使其包含Funtastic\FooBar命名空间。假设您已经有一个App命名空间:

  "autoload": {
    "psr-4": {
      "App\\": "src/",
      "Funtastic\\FooBar\\": "lib/foobar/src"
    }

此外,您还需要检查require原始包的部分,看看它是否依赖于任何包,并将这些包添加到应用程序的composer.json.

有了所有这些并composer.json正确编辑后,您只需重新生成自动加载器 ( composer dump-autload),您就可以开始使用了。

显然,由于我不知道您的包和项目的细节,您必须根据您的具体情况调整这些说明,但是让包在您的应用程序中运行应该不会花费很长时间。


或者,如果您想继续将此包视为“外部”依赖项:

  1. 将所有包文件压缩到package.zip并放入base_dir/lib
  2. 将以下内容添加到您的 composer.json:
    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "vendor/name",
                "version": "1.0",
                "dist": {
                    "url": "lib/package.zip",
                    "type": "zip"
                }
            }
        }
    ],
    
    (最初由问题作者自己提出的解决方案)。

这样,文件将在您的项目中存在两次:作为“存储库”,并安装在 上vendor,我发现它不太理想。您也可以将文件保留在项目之外,但这需要额外的跟踪。

我个人会硬着头皮接受这个包不再是外部依赖项,而是应该由应用程序开发人员维护的文件。


推荐阅读