如何将项目外的文件添加到 Composer 类映射自动加载?

问题描述 投票:0回答:2

这是我的项目的结构

📦mainProject
 ┃
 ┣ 📂subProject1
 ┃ ┃
 ┃ ┗ 📜composer.json
 ┃
 ┗ 📂subProject2
   ┃
   ┗ 📜classINeed.php

我的

composer.json

{
  "autoload": {
    "classmap": ["../subProject2/classINeed.php"]
  }
}

命令

composer dump-autoload
不会返回任何错误,但
subProject1/vendor/composer/autoload_classmap.php
没有预期的
classINeed.php

是否可以将 项目外文件添加到 composer 自动加载类映射

php composer-php
2个回答
0
投票
{
  "autoload": {
    "classmap": ["../subProject2/classINeed.php"]
  }
}

是否可以将项目外文件添加到作曲家自动加载类映射中?

是的,要将项目外文件放入 Composer 自动加载类映射中,您可以在项目外(即在其自己的项目内)定义它,将其放在自己的自动加载器中,然后需要其他项目。

然后你就可以把它放在那里了。

subProject1/composer.json

{
  "name": "main/sub-1",
  "require": {
    "main/sub-2": "1.0.0"
  },
  "scripts": {
    "post-autoload-dump": [
      "@php -r 'require __DIR__ . \"/vendor/autoload.php\"; var_dump(class_exists(\"Foo\"));'"
    ]
  },
  "repositories": {
    "main/sub-2": {
      "type": "path",
      "url": "../subProject2",
      "options": {
        "versions": {
          "main/sub-2": "1.0.0"
        }
      }
    }
  }
}

subProject2/composer.json

{
  "name": "main/sub-2",
  "description": "File I need",
  "autoload": {
    "classmap": ["classINeed.php"]
  }
}

然后运行进去

subProject1
:

$ rm -rf vendor && composer install
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Package operations: 1 install, 0 updates, 0 removals
  - Installing main/sub-2 (1.0.0): Symlinking from ../subProject2
Generating autoload files
> @php -r 'require __DIR__ . "/vendor/autoload.php"; var_dump(class_exists("Foo"));'
Command line code:1:
bool(true)

非常感谢您的回答,但遗憾的是我在 subProject2 中没有作曲家

在这种情况下 - 虽然不推荐 - 当然可以在第一个项目中提供该composer.json作为路径。

因此其他项目一定不能有composer.json。这是

package
存储库。

这里有一个扩展变体,另外显示了它:

subProject1/composer.json
subProject2/no-composer-json
composer.json
文件)

{
  "name": "main/sub-1",
  "require": {
    "main/sub-2-no-composer-json": "1.0.0"
  },
  "scripts": {
    "post-autoload-dump": [
      "# this time autoloader test with composer only",
      "classINeed::hasMagic__callStatic"
    ]
  },
  "repositories": {
    "packagist.org": false,
    "main/sub-2": {
      "type": "path",
      "url": "../subProject2",
      "options": {
        "versions": {
          "main/sub-2": "1.0.0"
        }
      }
    },
    "main/sub-2-no-composer-json": {
      "type": "package",
      "package": {
        "name": "main/sub-2-no-composer-json",
        "version": "1.0.0",
        "dist": {
          "type": "path",
          "url": "../subProject2/no-composer-json"
        },
        "autoload": {
          "classmap": ["classINeed.php"]
        }
      }
    }
  }
}

示例运行:

$ composer install
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Nothing to install, update or remove
Generating autoload files
> # this time autoloader test with composer only
> classINeed::hasMagic__callStatic
{
    "name": "hasMagic__callStatic",
    "argv": [
        "object Event: post-autoload-dump"
    ]
}

0
投票

Composer\Autoload\ClassLoader::addClassMap()

$loader = require PROJECT_DIR . '/vendor/autoload.php';
var_dump($loader->getClassMap());
$loader->addClassMap(['MyClass' => '/path/to/class.php']);
var_dump(new MyClass());
© www.soinside.com 2019 - 2024. All rights reserved.