Composer/Laravel 当外部存储库不再存在时从现有文件安装包

Composer/Laravel install package from existing files when external repository no longer exists

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

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

不需要给出代码示例,因为 none。

如果您拥有这些文件,并且您将无法继续使用 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 中的“require”部分。

所有这些都准备就绪并且 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 上,我觉得这不太理想。您也可以将文件保留在项目之外,但这需要额外的跟踪。

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