【问题标题】:Eclipse PDT - Filesystem changes or new Composer autoload paths break autoloaderEclipse PDT - 文件系统更改或新的 Composer 自动加载路径会破坏自动加载器
【发布时间】:2020-08-07 06:10:01
【问题描述】:

我正在 Composer 中创建一个项目使用 Eclipse PDT,但是每次我将文件添加到 composer 自动加载基目录下的目录时,phpunit 测试运行程序都无法再找到我的文件。

至少 2 次我做了一些修补并让它再次工作,但似乎每次我更改文件系统时它都会中断。我希望 Composer 自动加载器能够在不考虑 fs 更改的情况下找到我的文件。

这是我最新的自动加载器配置:

{
    "name": "someone/webapp",
    "description": "",
    "require-dev":  {
        "phpunit/phpunit":"~9.0",
        "squizlabs/php_codesniffer": "~3.0"
    },
    "require": {
        "doctrine/orm": "~2.7"
    },
    "autoload" : {
        "psr-4": {
            "WebApp\\": "src/"
         }
    },
    "autoload-dev" : {
        "psr-4": {
            "WebApp\\Tests\\" : "tests/"
        }
    }
}

我之前尝试过使用符合 PSR-0 标准的自动加载器:

{
     "name": "srmes/shopping-app-test",
     "description": "Developer test. Basic OO-orientated PHP webapp",
     "require-dev": {
        "phpunit/phpunit":"~9.0",
        "squizlabs/php_codesniffer": "~3.0"
     },
     "require": {
         "doctrine/orm": "~2.7"
     },
    "autoload" : {
         "classmap": ["src/", "src/Models/"],
         "psr-0": {
             "WebApp\\": "src/",
             "WebApp\\Models\\": "src/Models/"
         }
    },
    "autoload-dev" : {
         "classmap": ["tests/", "tests/Models/"],
         "psr-0": {
             "WebApp\\Tests\\" : "tests/"
         }
    }
}

我的问题是指将文件添加到自动加载目录。我的目录结构如下:

someone/webapp
|-vendor
| |-MISC_PACKAGES
|- src --autoloader base dir
| |-Models
| | |-Product.php
| | |-Furniture.php
| |- IComparable.php -- THIS WAS ADDED, BREAKING AUTOLOADER
|- tests -- autoloader base dir
| |- Models
| | |- FurnitureTest.php
| | |- IProductTest.php
| |-bootstrap.php

编辑:

正如我在下面的评论中所示,我发现这个问题与 Eclipse PDT 自动完成有关,只有在使用随后的新作曲家 require 语句等提交到 git 后才有效,这不太理想对我来说,因为我想在提交之前尝试使用 packagegist 包

【问题讨论】:

  • 您不应该自己更改文件,而是让 composer 来完成工作。 AFAIK,可以插入测试路径。如果有,请尝试在最新 2020.1 版本中支持该功能的 PhpStorm IDE。
  • 我不明白你所说的“插入”是什么意思,我应该通过 composer 命令在我的自动加载器目录中创建文件吗?
  • 当您使用 composer init 启动一个项目并使用 composer require 添加您的包时,composer 会管理该文件。见config。 (搜索测试)这个answer也可能有帮助。
  • 要求包和引导 phpunit 不是我想问的这个问题,但也许不清楚我是否添加了更新:)
  • 将 IComparable.php 放入建议“接口”的目录中。这不能在“根”路径上,因为自动加载器找不到它。

标签: php filesystems require autoload


【解决方案1】:

Composer/PHPUnit 问题

您的问题与 Eclipse PDT 本身无关。在您的作曲家中,您注册了 classmap 和 PSR-0。 Classmap 要求 composer 重新扫描您的目录以查找新的类 [1]。

src/ 目录的 PSR-4 就足够了。例如,如果您在 src/Service/Foo.php 自动加载器(例如 phpunit)中创建 WebApp\Service\Foo 类,则会找到它。

警告:如果你使用"optimize-autoloader": true 或运行composer install--optimize-autoloader 或dump-autoload 和--optimize 你的PSR4/PSR-0 将被转换为类图!!!

我假设你正确地将 composer autoloder 注册为 phpunit bootstrap。

Eclipse PDT 问题

您不必每次都删除/添加 composer 支持,但是因为您在 eclipse 之外运行 composer update 您必须在每个 composer installcomposer update 之后执行额外的任务:

  1. 在项目上按 F5(刷新)以确保 eclipse 与文件系统同步。如果您启用了自动同步将正常工作
  2. click on project -> composer -> update build path
  3. 有时还需要清理项目

自动同步暂时不起作用,请参阅我的错误:bugs.eclipse.org/bugs/show_bug.cgi?id=515742

[1] - https://getcomposer.org/doc/04-schema.md#classmap

【讨论】:

  • 我在问题中确实说过我也尝试过使用 PSR-4。我将 composer.json 更改为 PSR-4,并尝试使用以下命令:composer dumpautoloadcomposer update 并在 Eclipse 上删除然后替换作曲家支持([root_project_folder]->configure->add/remove Composer 支持),更新构建路径等自从添加赏金后,我进入了属性并检查了构建路径。事实证明,构建路径通常很旧,并且与我的作曲家自动加载器的供应商名称空间不匹配,所以我不同意你的断言,我担心
  • 您要求 php 单元:“phpunit 测试运行器无法再找到我的文件”。现在你谈论 PDT 中的作曲家支持,所以我很困惑。
  • 您不必每次都删除/添加作曲家支持,但是因为您在 Eclipse 之外运行作曲家更新,所以您必须执行其他任务: 1. 在项目上按 F5(刷新)以确保 Eclipse 是与文件系统同步。如果您启用了自动同步将正常工作 2. 右键单击​​项目 -> 作曲家 -> 更新构建路径 自动同步暂时不起作用,请参阅我的错误:bugs.eclipse.org/bugs/show_bug.cgi?id=515742
  • 正如我在回答中所说的,PDT 对 Composer 自动加载器没有任何影响,它不关心,只依赖更新(或不依赖)构建路径,直到我最终放弃 DLTK 集成:P
  • 是的,对不起,我没有意识到我在询问 phpunit,因为我没有重新阅读。当我最初问我在 Eclipse 中的 phpuni 无法识别的命名空间中遇到 php autoloader 失败时,现在它只是 Eclipse,因为 PSR-4 修复了你建议的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-26
  • 2016-06-10
  • 1970-01-01
  • 2014-09-17
  • 2018-03-06
相关资源
最近更新 更多