Php Composer不尊重安装程序路径

Php Composer不尊重安装程序路径,php,composer-php,Php,Composer Php,以下是场景: 我有两个由composer推动的项目。第一个是这样的: { "name": "myusername/composer_test", "description": "Composer project for CircleK Drupal 8", "type": "project", "license": "GPL-2.0-or-later", "authors": [ { "name": "Name Surname", "role": "web

以下是场景:

我有两个由composer推动的项目。第一个是这样的:

{
"name": "myusername/composer_test",
"description": "Composer project for CircleK Drupal 8",
"type": "project",
"license": "GPL-2.0-or-later",
"authors": [
    {
        "name": "Name Surname",
        "role": "webdeveloper"
    }
],
"repositories": [
    {
        "type": "composer",
        "url": "https://packages.drupal.org/8"
    }
],
"require": {
    "php": ">=5.6",
    "composer/installers": "^1.2",
    "drupal-composer/drupal-scaffold": "^2.5",
    "drupal/core": "^8.7.0",
    "vlucas/phpdotenv": "^2.4",
    "webflo/drupal-finder": "^1.0.0",
    "webmozart/path-util": "^2.3",
    "zaporylie/composer-drupal-optimizations": "^1.0"
},
"minimum-stability": "dev",
"prefer-stable": true,
"extra": {
    "installer-paths": {
        "web/core": ["type:drupal-core"]
    }
}
}
第二个需要第一个,非常简单:

{
  "name": "user/site",
  "description": "Composer for Site",
  "type": "project",
  "license": "GPL-2.0-or-later",
  "authors": [
    {
      "name": "Name Surname",
      "role": "webdeveloper"
    }
  ],
  "repositories": [
    {
        "type": "git",
        "url": "git@github.com:myusername/composer_test.git"
    },
    {
          "type": "composer",
          "url": "https://packages.drupal.org/8"
    }
  ],
  "require": {
      "myusername/composer_test": "dev-drupal_only"
  },
  "minimum-stability": "dev",
  "prefer-stable": true
}

正如您所看到的,第一个通过定义
安装程序路径
来定义drupal核心应该放在哪里。事实证明,当我为第一个composer.json文件运行composer install时,drupal core会像应该的那样出现在
/web
目录中,然而当我为第二个文件运行composer install时,它确实会从第一个composer.json下载每个包,但drupal core会出现在主目录中,而不是
/web
。我知道我可以将
安装程序路径
放入最后一个composer文件并覆盖它,但这不是重点。我想要第一个文件来定义东西应该放在哪里。

额外的设置只适用于根包。考虑<代码>用户/站点< /代码>需要2个不同的包,它们都指定了不同的安装路径。作曲家应该使用哪一种,如何知道?通过忽略这些设置,除非在root composer.json中指定它们,否则composer可以避免任何意外/问题

有一种方法可以解决这个问题,您可以创建一个安装后脚本来确定正确的路径,例如,通过检查是否安装了
myusername/composer\u test
,以及是否设置了变量。这有点类似于Symfony在中的安装脚本。它提供了一个回退,以根据配置和文件夹结构确定要使用的正确目录(由于默认目录结构在~2.8中的变化,例如将应用程序/控制台移动到bin/console)


您可以编写自己的安装脚本来检查已安装的composer软件包。缺点是,就像您现在必须在第二个composer.json中指定额外的配置一样,您必须指定安装脚本,另外还必须编写安装脚本本身。因此,可能会有很多额外的工作,而不会从中获得很多。

许多composer设置仅适用于根包,而当composer文件作为依赖项加载时,它会忽略这些设置。我不知道这是不是其中之一。它可能值得研究?是的,非常感谢,这是我所怀疑的,但在composer Manual中找不到任何确认。对,我正在考虑设置composer钩子,在安装后运行并将文件移动到其指定路径,但如果是这样的话,我想我会做得有点不同。我认为您的解决方案会起作用,但它带来的是更多的复杂性,而不是简单性和自动化。当然,这在某些情况下可以应用,但不适用于我的项目需求。谢谢你的澄清。