什么是基于Composer的正确核心更新工作流程?


16

我想使用作曲家来管理Drupal 8依赖项,但是我不确定什么是正确的核心更新工作流程。目前,我正在使用drush将核心更新到最新的Beta版本,但是我的composer.json文件中还包含一些依赖项,因此在更新之后,我将使用composer install安装所有的contrib供应商依赖项。composer install尽管我刚刚将核心更新为最新版本,但似乎运行会覆盖核心目录中的某些文件。

我还尝试过手动编辑composer.json文件,并使用特定的beta版本(例如)替换“ drupal / core”行"drupal/core": "~8.0-beta14",,但它仍会覆盖core目录中的文件。

什么是正确的工作流程?

Answers:


11

我假设您使用drupal-composer / drupal-project作为项目的基础。如果没有,请查看该项目,然后将其与您的项目进行比较。

另外,您说过要使用composer来管理Drupal 8依赖项,因此我假设您已通过composer require drupal/devel而不是选择了contrib模块drush dl devel

如果您正在做所有这些事情,那么您应该使用它composer update来更新Drupal核心和所有contrib模块。只要保留composer.lock文件,就composer install不应更改任何依赖项的版本。您根本不应该使用drush pm-update。对您而言,core目录中的文件是否已更新都无关紧要,因为此目录由Composer管理。最好不要将作曲家管理的目录提交到存储库,尽管您可以根据需要这样做。

当然,drush updatedb只要composer update替换Drupal核心或任何模块,就应该运行。

为了避免获得开发版本,请使用Composer稳定性标志在composer.json文件中将最低稳定性设置为'beta' 。

如果您正在使用drupal-composer / drupal-project管理您的站点,则所有根目录级文件(如README.txt,.htaccess和index.html)都将归您的项目所有。这意味着您应该将它们检入git存储库;Composer不会更新它们,您必须在更改时自行更新它们。这些文件应该很少更改,但是drupal-composer / drupal-project 具有更新这些文件的脚本


假设我使用的是作曲家更新而不是drush pm-update,如何更新README.txt,.htaccess等文件?为何Drush Update提供与Composer Update不同的核心?我是否应该在每次更新之前将composer.json中的drupal版本替换为8.0-betaX?我不想使用dev。版本..
rreiss

更新了答案。
greg_1_anderson

+1 greg_1_anderson-看起来很棒,这是Drupal 8安全更新的确定方法吗?使用D7,它是:drupal.stackexchange.com/a/71578
therobyouknow

如果最初使用以下步骤安装了Drupal 8.1,则此方法似乎可以正常工作:drupal.org/node/2471553(我发现它可以正常工作)
therobyouknow

“当然,drush updatedb只要作曲家更新替换了Drupal核心或任何模块,就应该运行。” -谢谢,如果您最初是通过以下步骤安装drupal的,则为 drupal.org/node/2471553,那么您需要在Drupal 8安装中使用特定drush的完整路径(因为它们是最后一步,用于运行安装)。您首先需要cd进入web,然后在/ web中使用完整路径更新db的命令将是:(../vendor/drush/drush/drush updatedb我发现这可以工作)。
therobyouknow

2

对于8.4.x> 8.4.y的修补程序版本,以下是可以的,但对于8.4.x> 8.5.x的次要发行版,以下条件不可以。跳转至下面的UPDATE 3,以获取次要版本更新的“答案”。

1-备份您已修改的Drupal随附的所有文件,例如.htaccess,robots.txt等(其中2个是最常更改的)。

2- [被告知删除锁定文件是错误的,请参阅下面的UPDATE] 删除composer.lock文件(在您网站的顶级文件夹中)。这将在步骤5中重新创建。

3-检查您的composer.json (在您网站的顶级文件夹中),并确保“ drupal:core”在require部分而不是replace部分中,例如

"require": {
"drupal/core": "^8.4"
},

"replace": {
"drupal/core": "^8.4"
},

如果“ drupal / core”在替换部分中,请将其移至require部分并删除替换部分。如果替换部分中还有其他条目,只需删除“ drupal / core”而不是整个替换部分-但我认为“ drupal / core”通常是唯一的选择。

将您要更新的版本放在“ drupal / core”中,例如:

“ drupal / core”:“ ^ 8.5”-将更新为8.5的最新版本。“ drupal / core”:“ 8.4.6”-将更新至版本8.4.6。

5-运行此命令(在您站点的顶级文件夹中):

composer update drupal/core --with-dependencies

6-如果没有错误,请照常执行,运行更新并清除缓存:

drush updatedb
drush cr

或者,如果不使用drush,请转到/update.php以运行更新,然后转到admin / config / development / performance,然后点击“清除所有缓存”按钮。

7-如果您已在第一步中备份了文件(.htaccess,robots.txt),请放回它们。但是请检查Drupal是否对这些文件进行了更新并将这些更改添加到您的文件中。

完成

如果步骤5中的作曲者更新存在错误,通常是由于vendor文件夹中内容的版本存在问题。

这是处理此类问题的好文章:https : //www.jeffgeerling.com/blog/2018/updating-drupalcore-composer-drupal-core-doesnt-update并阅读Jeff在Drupal和Composer上的其他2篇文章以获得关于此的更多知识。

Twitter上的2个人告诉我,不应删除composer.lock(上面的步骤2)。该composer update drupal/core --with-dependencies命令仍然会重新创建锁定文件。

在测试此方法时,我发现它适用于8.4.3> 8.4.6(例如),但出现8.4.6> 8.5.x错误。当我弄清楚时会报告。

错误示例:

Your requirements could not be resolved to an installable set of packages.
  Problem 1
    - symfony/yaml 3.4.x-dev conflicts with symfony/console[v3.2.8].
    - symfony/yaml 3.4.x-dev conflicts with symfony/console[v3.2.8].
    - symfony/yaml 3.4.x-dev conflicts with symfony/console[v3.2.8].
    - drupal/core 8.5.0 requires symfony/yaml ~3.4.5 -> satisfiable by symfony/yaml[3.4.x-dev].
    - Installation request for drupal/core 8.5.0 -> satisfiable by drupal/core[8.5.0].
    - Installation request for symfony/console (locked at v3.2.8, required as ~3.2.8) -> satisfiable by symfony/console[v3.2.8].

杰夫·吉林(Jeff Geerling)的这篇文章解决了类似的问题,但到目前为止对我来说没有运气:https : //www.jeffgeerling.com/blog/2018/updating-drupalcore-composer-drupal-core-doesnt-update

因此,对于8.4.x> 8.5.x来说,似乎唯一适合我的是很多人似乎都在使用的“核选项”,该选项可以运行composer update

我想只要您确定composer.json中的模块版本就可以。也许应该将其锁定为当前版本。例如:

"drupal/address": "1.3"

而不是:

"drupal/address": "^1.3"

但是正确的答案是吗?

确定似乎无处不在的答案是做“核选项”:

A.删除/vendor文件夹。

B.运行composer update并只需更新您的模块以及核心。或者,composer.json如果您不想更新模块版本,请锁定它们。

Drupal Slack上的一位人士说:“ Composer的全部理念是,您应该始终尽可能频繁地更新软件包”。打包包括我认为的模块。所以我猜这是有道理的。

一旦我从8.4.6升级到8.5.0,就可以从8.5.0升级到8.5.1了,composer update drupal/core --with-dependencies就像从8.4.3升级到8.4.6一样。

我开始得出结论,“答案”是删除供应商文件夹和composer.lock文件,然后使用composer update就可以了,并且应该简单地确保composer.json文件中依赖项的版本号是您想要的。管理要保留或允许在其中更新的模块版本并不重要composer.json

例如:

"drupal/admin_toolbar": "1.18", 表示坚持1.18

"drupal/admin_toolbar": "^1.18", 表示继续进行更新,但要在1.x(而不是2.x)之内

这是通过对此帖子的评论(Redneck将军)来支持的:https : //www.jeffgeerling.com/blog/2018/updating-drupalcore-composer-drupal-core-doesnt-update “我做过的其中一件事情我在支持部门工作时发现,锁定模块和内核的版本是一个好主意,因此您可以在需要时进行热启动,因为有时某些插件甚至不希望其行为正常。”

顺便说一句,composer.lock文件没有帮助,composer update因为它被吹走了(与composer install读取他的锁定文件相反):

运行composer install将:

  • 检查是否composer.lock存在
  • 如果不是,请执行composer update创建一个
  • 如果composer.lock存在,请从锁定文件中安装指定的版本

运行composer update将:

  • 校验 composer.json
  • 根据您的版本规格确定要安装的最新版本
  • 安装最新版本
  • 更新composer.lock以反映安装的最新版本

参考:https : //www.engineyard.com/blog/composer-its-all-about-the-lock-file

我看到上面提到了这一点:https : //github.com/drupal-composer/drupal-project。我已经用过了,这很好,但这不是将Composer与Drupal一起使用的必要条件。就像名称中的“声音”一样,这令人困惑。当我刚开始使用Drupal 8时,我认为这是必需的,因此用它构建了我的第一个D8站点,并认为这是最佳实践。

Drupal的“版本”将docroot放在/ web文件夹中,而不是在项目的顶部文件夹中。与正常的Drupal相比,.gitignore还添加了很多东西:

/drush/contrib/
/vendor/
/web/core/
/web/modules/contrib/
/web/themes/contrib/
/web/profiles/contrib/
/web/libraries/

因此,此版本的Drupal实际上更适合于使用持续集成,使用composer安装在每个部署上进行新版Drupal构建的站点。如果您使用更常规的方法进行部署,则显然必须将以上所有内容提交到git repo中,否则它将无法部署到您的服务器[1],并且运行Drupal都需要这些内容。

[1]如果git与您的部署有关-如果您使用SFTP进行部署,请忽略此操作。


composer update drupal/core symfony/config webflo/drupal-core-strict --with-dependencies从来没有让我失败过。适用于多个次要版本,例如8.3-> 8.6
Clive

1

使用packagist.org上的drupal / core包,我们实际上可以通过composer管理core,contrib模块(,主题和配置文件)以及其他供应商。

我已经在根目录中设置了以下文件并执行了 composer install

composer.json

{
  "require": {
    "composer/installers": "^1.0.20",
    "drupal/core": "8.0.*"
  },
  "extra": {
    "installer-paths": {
      "core": ["type:drupal-core"],
      "modules/contrib": ["type:drupal-module"],
      "profiles/contrib": ["type:drupal-profile"],
      "themes/contrib": ["type:drupal-theme"]
    }
  },
  "scripts": {
    "post-install-cmd": [
      "./post_install.sh"
    ]
  }
}

post_install.sh

#!/usr/bin/env bash
export RAW_DRUPAL="https://raw.githubusercontent.com/drupal/drupal/8.0.x"
curl $RAW_DRUPAL/example.gitignore > example.gitignore
curl $RAW_DRUPAL/.gitattributes > .gitattributes
curl $RAW_DRUPAL/.htaccess > .htaccess
curl $RAW_DRUPAL/.csslintrc > .csslintrc
curl $RAW_DRUPAL/.editorconfig > .editorconfig
curl $RAW_DRUPAL/.eslintrc > .eslintrc
curl $RAW_DRUPAL/.eslintignore > .eslintignore
curl $RAW_DRUPAL/index.php > index.php
curl $RAW_DRUPAL/update.php > update.php
curl $RAW_DRUPAL/web.config > web.config
curl $RAW_DRUPAL/autoload.php > autoload.php
curl $RAW_DRUPAL/robots.txt > robots.txt
mkdir -p sites/default
curl $RAW_DRUPAL/sites/example.sites.php > sites/example.sites.php
curl $RAW_DRUPAL/sites/development.services.yml > sites/development.services.yml
curl $RAW_DRUPAL/sites/example.settings.local.php > sites/example.settings.local.php
curl $RAW_DRUPAL/sites/default/default.services.yml > sites/default/default.services.yml
curl $RAW_DRUPAL/sites/default/default.settings.php > sites/default/default.settings.php

请享用 :)


我想我将需要您完成的所有卷曲魔术。我期望所有这些需要的文件都可以由作曲家放置。
dxvargas

@hiphip核心目录外部的文件不会经常更改,因此上面的脚本可能是您在drupal从一个次要版本更新到下一个版本(即8.1到8.2)时手动执行的脚本
Eyal

1

是的,您可以使用作曲家管理Drupal核心。虽然有几件事要注意。

由于composer必须运行许多项,因此您可能会超时,尤其是在本地VM中运行时。如果运行composer install,很可能会收到作曲家错误:

 [RuntimeException]                                    
  Could not delete core/.nfs0000000000000000000001:

确保您使用require

{
  "require": {
   "drupal/core": "8.3.*"

还要在配置中为超时添加扩展名

    "installer-paths": {
        "core": ["type:drupal-core"],
        "modules/contrib/{$name}": ["type:drupal-module"],
        "profiles/contrib/{$name}": ["type:drupal-profile"],
        "themes/contrib/{$name}": ["type:drupal-theme"],
        "drush/contrib/{$name}": ["type:drupal-drush"],
        "modules/custom/{$name}": ["type:drupal-custom-module"],
        "themes/custom/{$name}": ["type:drupal-custom-theme"]
    }
},

"config":{
            "process-timeout": 1600
       },

另外,如果这不起作用,您可以在VM中从外部SSH运行composer install 。

这将绕过所有NFS共享超时,并在正确的位置解压缩Drupal。


0

“ drupal / core”:“〜8.0-beta14”表示任何大于8.0-beta14且小于9的发行版!您需要删除波浪号以将其锁定到特定版本。然后确保通过运行composer来更新锁定文件,并在目标系统上使用composer install。

一种简单的入门方法是使用https://github.com/drupal-composer/drupal-project构建代码库。

当我们需要更新诸如升级核心之类的内容时,您可以在本地运行“ composer up”。这将更新composer.lock文件。

当其他开发人员撤职或使用部署脚本时,您将运行“ composer install”,该安装程序使用了锁定文件。

在composer.json中的Drupal核心行是:

"drupal/core": "~8.0",

波浪号()表示8号(但不是9)内的任何释放

如果要将其锁定为特定版本,则不应使用波浪号。

"drupal/core": "8.0-beta14",

然后在本地运行“ composer up”,提交composer.json和composer.lock文件,然后在拉下代码库后在其他安装中运行“ composer install”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.