阻止 Composer 更新重新安装

Posted

技术标签:

【中文标题】阻止 Composer 更新重新安装【英文标题】:prevent Composer update to reinstall 【发布时间】: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 你能解决这个问题吗?我的回答有帮助吗? 感谢您的回答,我会尽快查看,我可能与您在不同的时区:) 【参考方案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

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

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


其他阅读/资源:

https://github.com/composer/composer/issues/601

https://github.com/composer/composer/issues/4011

https://github.com/franzliedke/studio

【讨论】:

我认为将两者结合起来可能会奏效。因为如果我只使用路径,部署(composer install)将无法在生产服务器上工作。但是,如果我在本地使用路径(在替代 composer.json 中)并在其他任何地方使用存储库,它可能会起作用

以上是关于阻止 Composer 更新重新安装的主要内容,如果未能解决你的问题,请参考以下文章

--enable-phar=shared 我是不是必须重新编译 PHP 才能安装 Composer?

在 ubuntu 18.04.4LTS 上重新安装 gitlab 后,gitlab-reconfigure 在 redis 上被阻止

用composer 安装yii2框架

安装 Laravel 时收到错误,如何知道是不是需要重新安装? [复制]

安装yii2时,composer安装遇到的一些问题

composer(作曲家)安装php-ml