【问题标题】:How to make laravel a composer dependency for my project如何使 laravel 成为我项目的作曲家依赖项
【发布时间】:2021-10-22 09:36:50
【问题描述】:

我的项目是一个 Laravel 实现。我创建了一个 composer.json 文件如下:

{
    "name": "company/project",
    "description": "My cool project.",
    "type": "project",
    "license": "proprietary",
    "require": {
        "laravel/laravel": "8.*"
    }
}

我可以把这个文件放在它自己的目录中并运行composer install。这将安装laravel/laravel 的版本8 和vendor/ 目录中的所有依赖项。但这不是一个有效的 Laravel 安装。如果我然后将vendor/laravel/laravel 的内容向上移动到主目录中,将.env.example 复制到.env 并运行composer -o dump-autoload,那么我有一个看起来(据我所知)的目录结构,就像标准 Laravel 安装。

但是,当我尝试通过浏览器访问该站点时,我收到 500 服务器错误,Apache 或 Laravel 日志中没有明显的条目。

我知道这不是 Apache 配置错误,因为我可以使用命令 composer create-project laravel/laravel:8.* {directory} 创建完全相同的站点,并且我得到一个功能基本的 Laravel 站点。

我的最终目标是使用 composer 安装我的项目和 Laravel,以及它的所有依赖项,并获得一个正常运行的站点。我对能够通过composer.lock 文件锁定所有依赖项(包括laravel/laravel 的特定版本)特别感兴趣,该文件随后将包含在我的项目的版本控制源中。

你可能会问为什么我不只使用推荐的命令来创建一个干净的 Laravel 安装并且只对生成的 composer.lock 文件进行版本控制。原因是:该文件不包含laravel/laravel 的特定版本。所以当我在一个干净的目录中使用composer.json/lock文件时,核心laravel/larvel文件丢失了。

关于我做错了什么的任何指针?或者有没有更简单的方法来实现我的目标?

【问题讨论】:

  • 运行composer create-project ...,然后编辑生成的composer.json(手动或通过composer require ...)以根据您的其他需求进行自定义。您永远不应该手动复制/移动目录。
  • laravel/laravel 不是项目的依赖项,它是为您提供 shell 设置以使用框架(也称为 laravel 应用程序)的框架项目......框架和其他包是依赖项
  • Alex Howansky 和 ​​lagbox。我的问题是:如果laravel/laravel 的版本未在基本composer.json 文件中的任何位置列出,我该如何修复它?
  • 例如...bootstrap/ 目录和artisan 命令由laravel/laravel 提供。这些随着版本的变化而变化。我需要确保我使用的这些文件的版本与我用于测试我的项目的版本相同。
  • laravel/laravel 是骨架项目......这是你用来构建应用程序的东西,当你运行 composer create-project laravel/laravel ... 时创建的所有东西都是你的项目(因此 create-project),有在那之后没有到laravel/laravel 的链接(它不是任何东西的依赖项,永远)...composer.json 文件将锁定依赖项的版本,例如框架

标签: php laravel composer-php


【解决方案1】:

你的 composer.json 只需要 "laravel/laravel": "8.*",但 Laravel 需要更多才能正常运行。当我执行composer create-project laravel/laravel 时,它会生成一个composer.json,其中包含以下内容:

{
    "name": "laravel/laravel",
    "type": "project",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "require": {
        "php": "^7.3|^8.0",
        "fruitcake/laravel-cors": "^2.0",
        "guzzlehttp/guzzle": "^7.0.1",
        "laravel/framework": "^8.54",
        "laravel/sanctum": "^2.11",
        "laravel/tinker": "^2.5"
    },
    "require-dev": {
        "facade/ignition": "^2.5",
        "fakerphp/faker": "^1.9.1",
        "laravel/sail": "^1.0.1",
        "mockery/mockery": "^1.4.2",
        "nunomaduro/collision": "^5.0",
        "phpunit/phpunit": "^9.3.3"
    },
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "scripts": {
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover --ansi"
        ],
        "post-update-cmd": [
            "@php artisan vendor:publish --tag=laravel-assets --ansi"
        ],
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate --ansi"
        ]
    },
    "extra": {
        "laravel": {
            "dont-discover": []
        }
    },
    "config": {
        "optimize-autoloader": true,
        "preferred-install": "dist",
        "sort-packages": true
    },
    "minimum-stability": "dev",
    "prefer-stable": true
}

现在,这不仅仅是需要一个供应商文件夹,其中包含命名空间声明、脚本和其他一些东西的要求。 另请注意,这需要laravel/framework 而不是laravel/laravel

总而言之,我建议使用此处的完整列表并继续剥离,直到它中断为止。

关于版本锁定,您可以将composer.lock-file 放入您的VCS 中,然后只运行composer install(如果有锁定文件,则不会更新)。 您还可以从您不想更新的所有版本中删除^,这样您就可以根据需要限制具有一些更新空间的版本。 8.0.1 将保持在 8.0.1,但您可以通过将 8.0.* 指定为版本要求来允许补丁。

【讨论】:

  • 是的。我已经经历了这一切。问题是 Laravel 的根包是laravel/laravel。反过来laravel/laravel 需要您上面列出的所有包。所以我的项目只需要在它的composer.json 文件中需要laravel/laravel,并且composer 会解析所有后续依赖项。我还浏览了 Laravel 的 composer.json 文件中的所有脚本并运行它们(手动或通过dump-autoload。简而言之,感谢您的回复,但它并没有增加我对问题的现有理解/解决方案。
  • 但是如果您需要 laravel 作为依赖项,那么您基本上是在您的供应商文件夹中安装 laravel?我看不到它的工作原理,但也许我错了,从未尝试过。
  • L00_Cypher3r:是的。这就是发生的情况,但我可以将vendor/laravel/laravel 的内容移动到顶级目录中,一切看起来都是正确的。但是当我尝试使用生成的目录时,Apache 服务器报告了 500 错误。
【解决方案2】:

最后,我放弃了尝试完成这项工作。相反,我现在按照以下步骤安装新站点:

composer create-project --no-install --no-scripts laravel/laravel:{version} {SITE}
cd {SITE}
svn export --force {repo}/composer.json .
svn export --force {repo}/composer.lock .
composer install
svn co {repo} .
svn -R revert .

这让我可以使用我需要的特定版本的 Laravel 创建一个网站。

【讨论】:

    猜你喜欢
    • 2018-03-06
    • 2013-04-20
    • 2015-04-06
    • 2014-04-20
    • 2014-03-10
    • 2018-09-23
    • 2016-08-14
    • 2013-10-09
    • 2021-11-16
    相关资源
    最近更新 更多