Compiler errors MUnit和MCover“;无效的包…应为<;空的>&引用;错误
在Windows 7上使用munit 2.1.2和Haxe 3.2.1,尝试为HaxeFlixel游戏(flash target)编译自动生成的示例测试(使用标准的Compiler errors MUnit和MCover“;无效的包…应为<;空的>&引用;错误,compiler-errors,package,haxe,haxeflixel,Compiler Errors,Package,Haxe,Haxeflixel,在Windows 7上使用munit 2.1.2和Haxe 3.2.1,尝试为HaxeFlixel游戏(flash target)编译自动生成的示例测试(使用标准的haxelib run munit gen,然后使用haxelib run munit和/或不使用-覆盖率运行)。我得到: HaxeWrapper.hx:73: --macro:1: character 0 : Invalid package : subfolder should be <empty> HaxeWrapp
haxelib run munit gen
,然后使用haxelib run munit
和/或不使用-覆盖率运行)。我得到:
HaxeWrapper.hx:73: --macro:1: character 0 : Invalid package : subfolder should be <empty>
HaxeWrapper.hx:73:--宏:1:字符0:无效的包:子文件夹应为
…其中子文件夹
是我的主源
目录的子文件夹。游戏本身编译得很好,引用了子文件夹。*
(和子文件夹.nestedsubfolder.*
等)到处都是包,但是源代码
中的一些类本身的名称空间只是包代码>
给出的行号并没有确切地告诉我在我的项目中可能需要修复什么…在我尝试(从头开始)挖掘HaxeWrapper.hx之前,这是一个已知的问题,在一个项目中有子文件夹/不同的包名,还是什么
顺便说一句,我还有另一个项目没有出现这种情况,但在该项目中,source
只包含一个子文件夹,其中的所有内容都共享同一个包名称空间(即包子文件夹;
)。(这就是我的问题。)
更新
早些时候,我让mcover也在我的项目中工作,只是为了手动测试指标。从那以后,它增长了很多,因此,我把东西组织到了包的子文件夹中。同时,我还没有在启用mcover的情况下尝试它,因为它使得调试过程中的单步执行更加麻烦。现在,当我重新启用mcover时,我的项目将不会编译,并给出与上面相同的错误消息,但没有HaxeWrapper.hx:73:
前缀。我认为这意味着您正在自动生成文件到子文件夹中,而没有包子文件夹代码>在它们中。我以前从未听说过mcover,但似乎在某些代码导致Haxe在文件系统中查找Haxe类文件,而Haxe发现该文件没有与Haxe找到它的路径相匹配的package
语句时会产生类似的错误消息。但是,它产生的错误与您预期的不同
预期错误示例
子文件夹/MyClass.hx
:
class MyClass {
public static function main() {
Sys.println("hi");
}
}
package subfolder;
class AnotherClass {
static function main() {
MyClass.main();
}
}
输出:
>haxe -cpp x.cpp subfolder.MyClass
Invalid commandline class : subfolder.MyClass should be MyClass
>haxe -cpp x.cpp subfolder.AnotherClass
subfolder/AnotherClass.hx:5: characters 4-11 : Invalid package : subfolder should be <empty>
这是我在尝试访问MyClass
时希望看到的错误。但是,似乎只有当Haxe最初尝试解析指定为入口点的类名时,才会出现此有用的错误消息
相同的原因,不同的错误
假设您仍有如上所述的子文件夹/MyClass.hx
,请使用适当的包添加一个新类
语句:
子文件夹/AnotherClass.hx
:
class MyClass {
public static function main() {
Sys.println("hi");
}
}
package subfolder;
class AnotherClass {
static function main() {
MyClass.main();
}
}
输出:
>haxe -cpp x.cpp subfolder.MyClass
Invalid commandline class : subfolder.MyClass should be MyClass
>haxe -cpp x.cpp subfolder.AnotherClass
subfolder/AnotherClass.hx:5: characters 4-11 : Invalid package : subfolder should be <empty>
>haxe-cpp x.cpp子文件夹.AnotherClass
子文件夹/AnotherClass.hx:5:字符4-11:包无效:子文件夹应为
如果我转到另一个类。hx:5:5
(字符4-11
似乎是0索引的?),我会看到MyClass
。因此,真正让它窒息的是,它希望加载子文件夹.MyClass
,但加载模块后,模块声称其完全限定名为MyClass
,因为它没有包
语句
申请质询
因此,据我猜测,您的mcover工具生成的文件缺少包
语句。如果它有一个类似于-namespace
或-root-package
的选项,或者如果您可以告诉它分析
目录而不是/subfolder
,那么它的性能可能会更好。您是否向mcover工具传递了一个值,而不是传递给haxe-cp
的值
基于mcover的另一个想法是,它正在引用项目中缺少包子文件夹的.hx文件代码>。如果我将AnotherClass.hx
更改为不调用MyClass.main()
,我可以使用子文件夹.AnotherClass
作为入口点成功编译。如果Haxe没有被正在分析的其他代码引用,它甚至不会尝试解析/读取MyClass.hx
。使用覆盖率工具,该工具可能会尝试包装/自动生成引用它发现的所有文件的代码,即使是Haxe本身通常不会编译的文件。当然,这一点是为了弄清楚哪些代码从未得到任何覆盖/从未运行;-)
总之,如果您可以在错误消息引用的源代码位置找到类名,然后检查Haxe将基于类名加载的.hx
文件,则可能会找到缺少的包
语句。虽然我不确定当错误没有源代码位置时你能做什么。你能分享一些关于如何自动生成覆盖率测试的细节吗?@Gama11更新了这个问题。我使用了与另一个项目相同的方法。我的意思是只进行断言(true)测试,看看基础设施是否正常工作。