drupal - 如何让 Composer 更喜欢稳定版本,但选择一些精选的开发版本?

标签 drupal composer-php

我想做什么

我正在尝试使用 Composer 管理 Drupal 8 及其模块。这就是我想做的:

  • 尽可能使用最新稳定版本的模块/库,除非在少数情况下我明确声明了其他情况。

(为什么?因为有时 Drupal 模块的稳定版本会被破坏,但它在 dev 中得到了修复,所以在这些情况下我只需要 dev 版本,直到出现新的版本为止。已发布。)

这是我的 composer.json 的示例:

  "require": {
    "composer/installers": "^1.0.21@stable",
    "wikimedia/composer-merge-plugin": "~1.3@stable",
    "cweagans/composer-patches": "~1.0@stable",
    "behat/mink-selenium2-driver": "^1.3@stable",
    "drupal/drupal-extension": "^3.1@stable",
    "drupal/bootstrap": "8.3.*@dev",
    "drupal/address": ">=8.1.0-beta2@beta",
    "drupal/advagg": ">=8.2.0-beta2@beta",
  },
  "replace": {
    "drupal/core": "~8.0"
  },
  "minimum-stability": "dev",
  "prefer-stable": true,

我想要 Bootstrap 的 dev 版本 ("drupal/bootstrap": "8.3.*@dev"),但是因为我设置了 prefer-stable: true ,然后我得到最新的 Bootstrap alpha,而不是开发版本。

如果我设置 prefer-stable: false,那么所有依赖项都会切换到开发版本(Symfony、Twig 等)。

read this article on Composer versioning ,但我找不到问题的解决方案。

编辑:请注意,此 composer.json 需要 Drupal packagist 存储库:

  "repositories": [
    {
      "type": "composer",
      "url": "https://packagist.drupal-composer.org"
    }
  ],

这是完整的composer.json:

{
  "name": "drupal/drupal",
  "description": "Drupal is an open source content management platform powering millions of websites and applications.",
  "type": "project",
  "license": "GPL-2.0+",
  "version": "8.0.3",
  "repositories": [
    {
      "type": "composer",
      "url": "https://packagist.drupal-composer.org"
    }
  ],
  "require": {
    "composer/installers": "^1.0.21",
    "wikimedia/composer-merge-plugin": "~1.3",
    "cweagans/composer-patches": "~1.0",
    "behat/mink-selenium2-driver": "^1.3",
    "drupal/drupal-extension": "^3.1",
    "drupal/address": "8.1.0-beta2",
    "drupal/advagg": "8.2.0-beta2",
    "drupal/bootstrap": "8.3.*@dev"
  },
  "replace": {
    "drupal/core": "~8.0"
  },
  "minimum-stability": "dev",
  "prefer-stable": true,
  "config": {
    "preferred-install": "dist",
    "autoloader-suffix": "Drupal8"
  },
  "extra": {
    "_readme": [
      "By default Drupal loads the autoloader from ./vendor/autoload.php.",
      "To change the autoloader you can edit ./autoload.php."
    ],
    "merge-plugin": {
      "include": [
        "core/composer.json"
      ],
      "recurse": false,
      "replace": false,
      "merge-extra": false
    },
    "patches": {
      "drupal/smtp": {
        "Remove install config" : "https://www.drupal.org/files/issues/remove_install-2651434-2.patch"
      }
    }
  },
  "autoload": {
    "psr-4": {
      "Drupal\\Core\\Composer\\": "core/lib/Drupal/Core/Composer"
    }
  },
  "scripts": {
    "pre-autoload-dump": "Drupal\\Core\\Composer\\Composer::preAutoloadDump",
    "post-autoload-dump": "Drupal\\Core\\Composer\\Composer::ensureHtaccess",
    "post-package-install": "Drupal\\Core\\Composer\\Composer::vendorTestCodeCleanup",
    "post-package-update": "Drupal\\Core\\Composer\\Composer::vendorTestCodeCleanup"
  }
}

最佳答案

首先,您作为示例提供的 composer.json 无效:

  • 不允许在节的最后一行使用逗号。
  • 在 Packagist 上找不到 drupal/bootstrapdrupal/addressdrupal/advagg

实现以下目标

Use the most recent stable version of modules/libraries whenever possible, except in a few cases where I explicitly declare otherwise.

您只需要设置"minimum-stability": "stable",这意味着仅获取稳定版本。并对您提到的明确的少数情况使用 @dev 标志。在这种情况下不需要 prefer-stable

我们以下面的composer.json为例。这将仅安装列出的软件包的稳定版本:

{
    "require": {
        "composer/installers": "^1.0.21",
        "wikimedia/composer-merge-plugin": "~1.3",
        "cweagans/composer-patches": "~1.0",
        "behat/mink-selenium2-driver": "^1.3",
        "drupal/drupal-extension": "^3.1",
    },
    "minimum-stability": "stable"
}

如果您现在将 require 部分的第一行更改为

"composer/installers": "^1.0.21",

"composer/installers": "^1.0.21@dev",

它将仅安装除composer/installers之外的所有列出的软件包的稳定版本。由于 @dev 标志会覆盖 "minimum-stability": "stable",因此将仅下载此软件包的开发版本。

Drupal Packagist 的另一个最小示例:

{
    "require": {
       "composer/installers": "^1.0.21",
       "wikimedia/composer-merge-plugin": "~1.3",
       "cweagans/composer-patches": "~1.0",
       "behat/mink-selenium2-driver": "^1.3",
       "drupal/drupal-extension": "^3.1",
       "drupal/bootstrap": "8.3.*@dev"
     },
     "replace": {
       "drupal/core": "~8.0"
     },
     "minimum-stability": "stable",
     "repositories": [
        {
            "type": "composer",
            "url": "http://packagist.drupal-composer.org"
        }
    ]
}

我仅使用了一个空文件夹,其中包含上面的 composer.json 并运行了 composer install。 (对于您的项目,您可以在运行 composer install 之前完全删除 vendor/ 文件夹并删除 composer.lock。之前请做好备份!) .

它安装了最新的开发版本的 drupal/bootstrap,您可以从下面的控制台输出中看到:

- Installing drupal/bootstrap (dev-8.x-3.x 6a37bf5)
  Cloning 6a37bf5977c54dde4fe58f40118a8c71ce7e145a

如果将已安装版本中的哈希 6a37bf5977c54dde4fe58f40118a8c71ce7e145ahttp://cgit.drupalcode.org/bootstrap/log/ 的源代码进行比较可以看到它安装了最新版本(此时 Issue #2672514 by neardark: update documentation )。

关于drupal - 如何让 Composer 更喜欢稳定版本,但选择一些精选的开发版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35537831/

相关文章:

drupal - 如何自定义 Drupal 7 中的默认用户注册页面

drupal - Drupal:使用l()创建仅 anchor 链接

curl -sS https ://getcomposer. 组织/安装程序 | php 无法在服务器上运行

php - Composer 完成执行后退出批处理文件

php - Symfony2 和 Composer 不安装包

php - 在创建/修改时将 Drupal 节点插入到 MongoDB

drupal - 如何清空 Drupal 缓存(没有开发)

php - Drupal 7 使用 If 条件 mysql 数据库选择查询

php - Composer - Forked Laravel 4.2 未安装

PhpStorm 禁用监视供应商 git 存储库