Compiler errors MUnit和MCover“;无效的包…应为<;空的>&引用;错误

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

在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>
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)测试,看看基础设施是否正常工作。