如何将项目中的文件添加到Composer Classmap AutoLoad?

发布于 2025-02-09 14:29:33 字数 29 浏览 2 评论 0 原文

这是我的项目的结构,


              

Here is the structure of my project

????mainProject
 ┃
 ┣ ????subProject1
 ┃ ┃
 ┃ ┗ ????composer.json
 ┃
 ┗ ????subProject2
   ┃
   ┗ ????classINeed.php

My composer.json

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

Command composer dump-autoload doesn't return any error but subProject1/vendor/composer/autoload_classmap.php doesn't have the expected classINeed.php

Is it possible to add an out of project file to composer autoload classmap ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

感情洁癖 2025-02-16 14:29:34
  {
  “自动加载”:{
    “ classmap”:[../ subproject2/classineed.php“]
  }
}
 

是否可以将项目文件添加到Composer AutoLoad ClassMap?

是的,要将项目文件列入Composer AutoLoad ClassMap中,您将其定义为项目(即在其自己的项目中),请使用其自动加载器,然后需要另一个项目。

然后,您将其放在那里。

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

中没有作曲家

- 虽然不建议 - 当然可以提供该作曲家。

因此,另一个项目不得拥有作曲家。这是软件包存储库。

这里是一个扩展变体,此外还显示它:

subproject1/composer.json subproject2/not-composer-json hapem coposer .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"
    ]
}
{
  "autoload": {
    "classmap": ["../subProject2/classINeed.php"]
  }
}

Is it possible to add an out of project file to composer autoload classmap ?

Yes, to get an out of project file into Composer autoload classmap you define it out of project (that is within its own project), have it in its own autoloader and then require the other project.

You then have it in there.

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"]
  }
}

Then run in 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)

Thanks a lot for your answer but sadly I don't have composer in subProject2

In this case - while not recommended - it is certainly possible to provide that composer.json for the path but within the first project.

Therefore the other project must not have a composer.json. This is the package repository.

Here an extended variant that shows it in addition:

subProject1/composer.json (subProject2/no-composer-json has no composer.json file)

{
  "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"]
        }
      }
    }
  }
}

Exemplary run:

$ 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"
    ]
}
拥醉 2025-02-16 14:29:34

Composer \ autoload \ classLoader ::

$loader = require PROJECT_DIR . '/vendor/autoload.php';
var_dump($loader->getClassMap());
$loader->addClassMap(['MyClass' => '/path/to/class.php']);
var_dump(new MyClass());

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());
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文