尝试在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:5
(characters 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
语句。虽然我不确定当错误没有源代码位置时你能做什么。