【问题标题】:MUnit and MCover "Invalid package...should be <empty>" errorMUnit 和 MCover“无效包...应该是 <empty>”错误
【发布时间】:2016-04-29 04:30:32
【问题描述】:

尝试使用 MUnit 2.1.2 和 Haxe 3.2 为 HaxeFlixel 游戏(闪存目标)编译自动生成的示例测试(使用标准 haxelib run munit gen,然后使用 haxelib run munit t 运行或不使用 -coverage)。 1 在 Windows 7 上。我得到:

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: 前缀。

【问题讨论】:

  • 您能否分享一些关于您如何自动生成覆盖测试的详细信息?
  • @Gama11 更新了问题。我使用了与其他项目相同的方法。我的意思只是 Assert(true) 测试,只是为了看看基础设施是否正常工作。

标签: compiler-errors package haxe haxeflixel


【解决方案1】:

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

预期错误示例

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,它的性能可能会更好。您向 mcover 工具传递的值是否与传递给 haxe -cp 的值不同?

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

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

【讨论】:

    猜你喜欢
    • 2017-05-20
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多