MUnit 和 MCover "Invalid package...should be <empty>"错误



尝试在Windows 7上使用MUnit 2.1.2和Haxe 3.2.1为HaxeFlixel游戏(flash target)编译自动生成的示例测试(使用标准haxelib run munit gen,然后使用haxelib run munit t运行,无论是否使用-coverage)。我得到:

HaxeWrapper.hx:73: --macro:1: character 0 : Invalid package : subfolder should be <empty>

其中subfolder是我的主source目录的子文件夹。游戏本身编译得很好,到处都有对subfolder.*(和subfolder.nestedsubfolder.*等)包的引用,但source本身中的一些类的名称空间仅为package;

给出的行号并不能准确地告诉我在我的项目中可能需要修复什么。。。在我尝试(在我的头脑中)挖掘HaxeWrapper.hx之前,这是一个项目中具有子文件夹/不同包名的已知问题吗?

顺便说一句,我有另一个项目没有发生这种情况,但在那个项目中,source只包含一个子文件夹,其中的所有内容都共享同一个包命名空间(即package subfolder;)。(这就是我的问题。)

更新

早些时候,我让mcover也在我的项目中工作,只是为了一个手动测试指标。从那时起,它增长了很多,因此,我将东西组织到包的子文件夹中。同时,我还没有在启用mcover的情况下尝试过,因为它使调试过程中的步进更加繁琐。现在,当我重新启用mcover时,我的项目将不会编译,给出与上面相同的错误消息,但没有HaxeWrapper.hx:73:前缀。

我认为这意味着您将在没有package subfolder;的情况下自动生成文件到subfolder中。我以前从未听说过mcover,但在某些代码导致Haxe在文件系统中查找Haxe类文件时,似乎会产生类似的错误消息,而Haxe发现该文件没有与Haxe找到它的路径匹配的package语句。然而,它会产生与您预期不同的错误。

预期错误示例

subfolder/MyClass.hx:

class MyClass {
  public static function main() {
    Sys.println("hi");
  }
}

输出:

>haxe -cpp x.cpp subfolder.MyClass
Invalid commandline class : subfolder.MyClass should be MyClass

这是我希望在尝试访问MyClass时看到的错误。但是,似乎只有当Haxe最初试图解析指定为入口点的类名时,才会出现此有用的错误消息。

相同原因,不同错误

假设您仍然有如上所述的subfolder/MyClass.hx,则添加一个具有适当package语句的新类:

subfolder/AnotherClass.hx:

package subfolder;
class AnotherClass {
  static function main() {
    MyClass.main();
  }
}

输出:

>haxe -cpp x.cpp subfolder.AnotherClass
subfolder/AnotherClass.hx:5: characters 4-11 : Invalid package : subfolder should be <empty>

如果我转到AnotherClass.hx:5:5characters 4-11似乎是0索引?),我会看到MyClass。因此,它真正令人窒息的是,它希望加载subfolder.MyClass,但在加载模块后,模块声称其完全限定名称为MyClass,因为它没有package语句。

问题申请

因此,据我所猜测,您的mcover正在生成缺少package语句的文件。如果它有-namespace-root-package这样的选项,或者如果您可以告诉它分析.目录而不是./subfolder,它可能会执行得更好。您是否将传递给haxe -cp的值以外的值传递给mcover工具?

基于mcover所做的另一个想法是,它引用了项目中缺少package subfolder;的.hx文件。如果我将AnotherClass.hx更改为不调用MyClass.main(),则可以使用subfolder.AnotherClass作为入口点成功编译。如果它正在分析的其他代码没有引用MyClass.hx,那么Haxe似乎甚至不会尝试解析/读取它。使用覆盖工具,该工具可能会尝试包装/自动生成引用它发现的所有文件的代码,即使是Haxe本身通常不会编译的文件。当然,这样做的目的是弄清楚哪些代码从未得到任何覆盖/从未运行;-)。

总之,如果您可以在错误消息引用的源代码位置找到类名,然后检查Haxe将根据类名加载的.hx文件,则可能会发现缺少package语句。虽然我不确定当错误没有源代码位置时你能做什么。

相关内容

最新更新