请尝试g8 etorreborre/etorreborre/specs2-scala-2.10.g8
。
你应该有这样的错误:
action parse error; template context is [anonymous]
line 1:1: unexpected token: e1
at org.antlr.stringtemplate.language.ActionParser.primaryExpr(ActionParser.java:813)
at org.antlr.stringtemplate.language.ActionParser.expr(ActionParser.java:539)
at org.antlr.stringtemplate.language.ActionParser.templatesExpr(ActionParser.java:222)
at org.antlr.stringtemplate.language.ActionParser.action(ActionParser.java:126)
at org.antlr.stringtemplate.StringTemplate.parseAction(StringTemplate.java:876)
at org.antlr.stringtemplate.language.TemplateParser.action(TemplateParser.java:162)
at org.antlr.stringtemplate.language.TemplateParser.template(TemplateParser.java:127)
at org.antlr.stringtemplate.StringTemplate.breakTemplateIntoChunks(StringTemplate.java:850)
at org.antlr.stringtemplate.StringTemplate.setTemplate(StringTemplate.java:441)
at org.antlr.stringtemplate.StringTemplate.<init>(StringTemplate.java:308)
at org.antlr.stringtemplate.StringTemplate.<init>(StringTemplate.java:293)
at org.clapper.scalasti.adapter.ScalastiStringTemplate.<init>(ScalastiStringTemplate.java:57)
at org.clapper.scalasti.StringTemplate.<init>(StringTemplate.scala:101)
...
我对包含涉及“$”的正则表达式的文件有同样的问题。
我认为 $ 可以逃脱。 尝试了 \$ 和 $$ 没有成功。
在修复此问题之前,我糟糕的解决方法是将其包含在代码中:
// This is to work around a parsing issue in giter8 - replace inlined dollar signs
val DOLLAR = (0x24).toChar
接着:
When("""^I retrieve the result""" + DOLLAR) { () =>
对于包含...的 HTML 文件,它也会失败。
$(function() {
即使写成:
\$(function() {
幸运的是,这次也可以找到解决方法:
jQuery(function() {
虽然我更喜欢“$”形式。
我有另一种解决方法。 在default.properties
文件中定义dollar=$
。 然后在您的模板中使用When("""^I retrieve the result""" + $dollar$)
。
你测试了吗? 我只是在解析default.properties
文件并提出问题时收到unexpected char: '$'
错误。
这绝对对我有用,但我最近没有尝试过。
您可以使用$"$"$
组合来解决此问题。
例如在 Scala 中:
s"$var" -> s"$"$"$var"
使用 AngularJs 的 javascript 模板会变得非常难看。 以及 Maven 属性、checkstyle 和 scalastyle xmls。
解析器应该向前寻找一个完整的 $var$ 模式,其中 var 不能有空格、换行符和任何在 var 名称中没有意义的字符。
如果没有修复,看起来美元是一个不幸的转义选择,而不是 {{ }}, <% %>, ?> 什么的。 占位符的位置很少,但在不同的上下文中可能有很多用于美元的位置。
我也会更改标题,因为它比插入字符串更普遍。
我可以改变模板引擎的行为来解决这个问题,但是有
有几种可能的解决方案:
$
: \$
或$$
。 但这不允许独立开发模板,这是我想实现的。[a-zA-Z_-]
,这可能会破坏一些现有模板,并且在某些情况下不起作用(例如,如果模板包含println(s"$name_$foo")
)。我个人更喜欢带有可选转义的第二种解决方案。
对于 Pamflet,我一直使用\$
来逃避。 我想知道这是否是 Pamflet 特有的,或者是否对 StringTemplate 进行了一些更改。
\$
对我有用。
也许这就是我用文档标记这个问题的原因。
转义的问题是,比如我想单独开发模板。
我创建了my-template.g8/src/main/g8/src/main/$package$/Main.scala
并且我想要
在my-template.g8/src/main/g8
创建 IDEA 项目,以便能够对其进行编辑和编译。
但如果我想写:
package $package$
object Main extends App {
val foo = "foo"
val bar = "bar"
println(s"\$foo\$bar") // I need to escape this
}
内部项目将无法正常工作。 与.gitignore
的.idea
文件夹相同。
@foxmk我认为这是一个与这里报道的完全不同的问题。 Eric 报告了“动作解析错误;模板上下文是 [匿名]”。
嗨,我最近也在尝试使用 giter8 创建一个模板,其中包含 sh 文件,这些文件将提供示例命令以使用正确的参数启动 docker 容器,因此有很多用$VAR
定义的环境变量
$"$"$
不再起作用,上面的其他解决方案也不起作用。 很可惜在这样的项目中看到这样一个孩子的问题。
我认为 #3 是正确的解决方案:
查找现有属性并忽略未知变量。 但我们至少应该通知用户。
用各种转义来污染整个源代码是没有意义的,而唯一的替换仅限于一个非常小的集合......
这假设文件default.properties
是强制性的,并且它包含所有可替换的名称及其默认值。
使用\$
转义对我来说使用 sbt 0.13.15 应该使用 Giter8 0.7.2
FWIW:我在 sbt 0.13.16 sbt-giter8
0.9.0 上遇到了这个问题; 不知道如何转义“$”
似乎有一个确定的正确解决方案(例如,如果在 build.properties 中没有指定令牌,那么不要试图找到收盘价)这是一个困难的改变吗? 如果是这样,人们会在哪里寻找呢?
FWIW,我相信我看到\$
和$"$"$
在使用 atm、SBT 1.1.0 和 Giter8 0.11.0-M2
拥有更智能的行为会很棒,例如自动转义未定义的变量或缺少结束 $ 符号时。
嗨,我最近也在尝试使用 giter8 创建一个模板,其中包含 sh 文件,这些文件将提供示例命令以使用正确的参数启动 docker 容器,因此有很多用
$VAR
定义的环境变量
我认为逐字逐句可以解决这里。
由于问题标题是Parsing issue when having template files including interpolated strings
并且,就像在上面的例子中一样,像\$
这样的转义美元与当前版本0.13.1
完美配合(见截图),我认为唯一剩下的就是正在将此详细信息添加到文档中。 我会尽快写PR。
最有用的评论
您可以使用
$"$"$
组合来解决此问题。例如在 Scala 中:
s"$var" -> s"$"$"$var"