使用Composer管理模块库依赖项


9

我已经在使用drupal-composer的自定义模块中找到了依赖关系如何在不使用Composer Manager的情况下在我的自定义模块中包含第三方库,以及如何管理与drupal 8有关的contrib模块composer依赖关系,这些都与我的问题有关,但是没有自Drupal 8.1和Composer管理器弃用以来,似乎不再适用。

同样流行的指南(如D8和Composer的权威介绍)似乎不再适用,因为它们也提到了composer manager。

与作曲管理器相对的另一种解决方案是更改核心composer.json文件,这感觉像是过多的核心黑客攻击,并且可能会随着Drupal核心(?)的每次Drush更新而中断。

更具体地说,我尝试将View vCard从Drupal 7 更新到8。我创建了composer.json文件,如下所示:

{
  "name": "drupal/views_vcards",
  "description": "Allows creation of vCards using the fields provided by the Views module.",
  "type": "drupal-module",
  "license": "GPL-2.0+",
  "homepage": "https://drupal.org/project/views_vcards",
  "require": {
    "maennchen/zipstream-php": "0.3.*"
  }
}

但是,如果我在模块文件夹中放置了composer.json文件,如何使Drupal知道该文件在那里,以及如何确保zipstream-php下载了所需的库?

简单地composer update从Drupal根目录运行确实会更新许多Drupal依赖关系,但是它不包括modules文件夹中的composer.json文件。我也不认为我应该composer install从具有依赖性的所有模块中调用。

如何在不使用作曲管理器和/或黑客内核的情况下使Drupal知道模块的依赖性?

更新:

core使用composer merge插件似乎支持通配符路径:

{
    "require": {
        "wikimedia/composer-merge-plugin": "dev-master"
    },
    "extra": {
        "merge-plugin": {
            "include": [
                "composer.local.json",
                "extensions/*/composer.json" // < ---- THIS LINE
            ],
            "require": [
                "submodule/composer.json"
            ],
            "recurse": true,
            "replace": false,
            "merge-dev": true,
            "merge-extra": false
        }
    }
}

为什么不合并核心modules/*/composer.json,这将解决所有问题?

更新2:

这个问题涵盖了不支持此问题的理由(该问题现在已经沉默了一段时间)。


1
编辑主作曲家文件是正确的方法。
2016年

如果让作曲家管理所有依赖项(包括核心),那么问题将消失。参见packagist.org/packages/drupal/core
Eyal,

这是我为另一个问题编写的示例作曲家文件:drupal.stackexchange.com/a/187097/40011
Eyal,

感谢您的回复@Eyal。因此,通过composer.json文件管理所有contrib模块是推荐的新方法,而下载和安装模块的麻烦正在被取代吗?显然,作曲者会自动解析嵌套的依赖项,并且确实还会下载我的依赖项。
Neograph734 '16

Answers:


6

使用drupal支架的新方法具有最大的灵活性

对于使用drush> 9.0.0的Drupal 8.4.0及更高版本,不建议使用drush make,您应该使用完整的作者流程,如下面drupal.org文档链接中所述。这些链接确实建议使用composer项目,但这可能不适用于每个人的Web服务器设置。以下是分步介绍如何手动设置composer.json 的详细说明。仍然可以完成有关手动添加模块的说明。

# Initialize composer. Stability alpha is important for custom modules that may be source managed outside of packagist or drupal.org
composer init --name myvendor/mysite --stability=alpha --license=GPLv2
composer config repositories.drupal composer https://packages.drupal.org/8
composer config discard-changes true

然后,您需要根据自己的喜好手动添加以下内容到composer.json ,因为按原样无法自动添加composer。这些将配置drupal-scaffold将模块安装在所需的位置(而不是在供应商/或其他开发人员选择的目录中)。将“ webroot”更改为“ www”或“ public”或您的主机名。

    "extra": {
        "installer-paths": {
            "webroot/core": ["type:drupal-core"],
            "webroot/modules/contrib/{$name}": ["type:drupal-module"],
            "webroot/modules/custom/{$name}": ["type:drupal-custom-module"],
            "webroot/themes/contrib/{$name}": ["type:drupal-theme"],
            "webroot/themes/custom/{$name}": ["type:drupal-custom-theme"],
            "webroot/profiles/{$name}": ["type:drupal-profile"],
            "webroot/libraries/{$name}": ["type:drupal-library"]
        },
        "patches": {}
    },
    "scripts": {
        "drupal-scaffold": "DrupalComposer\\DrupalScaffold\\Plugin::scaffold"
    }

现在,您可以安装一些依赖项。请注意,作曲家必须能够使用脚本和插件才能正常工作。

composer require composer/installers:^1.4.0 drupal-composer/drupal-scaffold:^2.3.0 cweagans/composer-patches:^1.6.2

一次运行drupal-scaffold脚本(或根据需要在构建服务器上):

composer drupal-scaffold

可以按照以下说明安装Drupal核心,模块,主题等,而无需drupal-merge-plugin。

composer require drupal/core:~8.5.1 drupal/views_vcards

使用drupal-merge-plugin或直接使用core的较旧方法

对于Drupal 8.1.0及更高版本,您可以使用composer直接要求Drupal模块。已更新有关在Drupal项目中使用Composer以及通过Drupal.org使用Composer安装Drupal软件包的文档,以利用drupal.org的packagist。我发现它在部署方案中已经很好地工作了。

composer config repositories.drupal composer https://packages.drupal.org/8
composer require drupal/views_vcards

对于开发,我认为手动添加依赖项composer require效果很好。合并方法也可以与drupal-merge-plugin一起使用,我将其用于草草制作工作流程。

composer config repositories.drupal composer https://packages.drupal.org/8
composer require mile23/drupal-merge-plugin
composer update

更新2016.06.22

我在使用drush make时遇到了一个问题,该问题使用semver添加了传统的Drupal版本标签和drupal.org包装专家URL。为此,我需要在https://packagist.drupal-composer.org上使用更稳定的packagist ,它仍然支持传统的Drupal版本标签。

还要注意,构建服务器或计算机需要大量内存才能进行Composer更新(或要求进行更新),这在所有在构建过程中无法在相似的开发计算机上运行Composer更新的情况下都是必需的。

更新2016.09.23

更新2018.03.30

  • 注意到有赞成票。这是相当古老的,因此决定(最近)不推荐使用rush make,因为这很陈旧,因此决定澄清一下最近的开发,并直接与作曲家一起设置您的网站。

1
我仍然非常习惯使用drush下载和安装模块,但是那将完全由作曲家取代吗?
Neograph734 '16

那就是drupalci现在的做法,但是在此之前,您可以直接使用merge插件。我最初为drupalci编写的补丁是drupal.org/files/issues/2597778-composer-contrib-18.patch。这已提交,但现在不再在代码库中,因为简化了使用打包程序并从作曲者iirc执行所有操作的过程。我也使用TravisCI执行以下操作:cgit.drupalcode.org/xero/tree/.travis.yml#n40。这将取决于您的工作流程。
mradcliffe

也许值得在此处为Composer的第三方库添加有关Asset Packagist的简介。许多Drupal发行版都采用了这种方法,现在有几个contrib模块也在使用它。我刚刚贡献了一些文档来正式宣布该解决方案drupal.org/docs/develop/using-composer/…drupal.org/docs/develop/using-composer/…–
JamesWilson
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.