【问题标题】:prevent Composer update to reinstall阻止 Composer 更新重新安装
【发布时间】:2019-08-05 07:20:29
【问题描述】:

我有一个带有一些依赖项的 Laravel 项目。这些依赖项之一是我们自己的包。我需要处理那个包。设置是我将我们的包符号链接到一个 git 存储库。

vendor/acme/ourpackage -> ~/ourpackagerepo

我在存储库中进行更改、提交,然后在父级中运行 Composer update 以获取更新的 composer.lock。这曾经工作得很好。但是在我们从 Gitlab 迁移到 Github 之后,composer update acme/ourpackage 会:

  • 删除 acme/ourpackage (dev-feature/fixedinformationlog fae89ac)
  • 安装 acme/ourpackage (dev-feature/fixedinformationlog 9bd7d4d):

从而覆盖符号链接!然后我必须删除文件夹并创建一个新的符号链接才能继续工作。这很麻烦,主要是因为 PHPStorm 需要重新索引。

来自 composer.json 的片段:

"repositories": [{
  "type": "vcs",
  "url": "git@github.com:acme/package.git"


"config": {
    "preferred-install": "dist",
    "platform": {
        "php": "7.0.12"
    },
    "use-github-api": false

关于如何让 composer 只更新,或者让 tha 文件单独更新,只更新 composer.lock 的任何想法?

【问题讨论】:

  • composer update acme/ourpackage --lock 说:“无需安装或更新”并且.lock 文件未更新
  • 将其添加为路径而不是存储库:getcomposer.org/doc/05-repositories.md#path
  • 感谢您的回答,但我不明白当我部署到服务器时会如何工作。当 composer 不知道 git-repository 在哪里时,如何安装包?
  • @jrewing 你能解决这个问题吗?我的回答有帮助吗?
  • 感谢您的回答,我会尽快查看,我可能与您在不同的时区:)

标签: php laravel git github composer-php


【解决方案1】:

我认为您在这里有几个选择:

1。 Composer 存储库路径

作为pointed out by @Loek,您可以使用路径 存储库。这是为了解决通常不属于 VCS(版本控制系统,例如 Git)或作为文件工件的场景。根据文档,您可以这样使用它:

{
    "repositories": [
        {
            "type": "path",
            "url": "../../packages/my-package",
            "options": {
                "symlink": true
            }
        }
    ],
    "require": {
        "my/package": "*"
    }
}

最需要注意的部分是这个:

如果可能,本地包将被符号链接,在这种情况下 控制台中的输出将读取 Symlinking from ../../packages/我的包。如果符号链接是不可能的包 将被复制。在这种情况下,控制台将输出 Mirrored from ../../packages/my-package.

代替默认的回退策略你可以强制使用符号链接 "symlink": true 或使用 "symlink": false 选项进行镜像。强迫 在从 单体存储库。

这个选项对我来说最有意义,也是我个人会选择的。

2。带环境变量的多个 Composer 配置

另一种选择是使用COMPOSER 环境变量as described here。这将允许您加载与默认命名文件不同的composer.json 文件。所以你可能有两个文件,根据你设置的环境变量,它会加载适当的文件并创建一个匹配的锁文件:

  • composer.json
  • composer-dev.json

好吧,那你到底为什么要这样做呢?好吧,由于您尝试在本地处理包的方式(使用活动的符号链接),但不希望在生产中发生这种情况,如果第一个选项没有,这可能会起作用。

我应该注意,您的目标应该始终是拥有一个在不同环境(即本地、暂存、生产)中工作相同的单一配置。我了解您希望立即在您的应用程序中查看对您的存储库的本地更改,并且为每个更改执行提交/推送/拉取过程是荒谬的。


其他阅读/资源:

【讨论】:

  • 我认为将两者结合起来可能会奏效。因为如果我只使用路径,部署(composer install)将无法在生产服务器上工作。但是,如果我在本地使用路径(在替代 composer.json 中)并在其他任何地方使用存储库,它可能会起作用
猜你喜欢
  • 2016-03-08
  • 2014-11-11
  • 2021-09-03
  • 2014-02-11
  • 1970-01-01
  • 2018-08-17
  • 2015-04-08
  • 2014-06-28
  • 2014-06-05
相关资源
最近更新 更多