Play 框架 Configuration file syntax and features 翻译

本文主要是对Play官方文档Configuration file syntax and features的翻译,也方便以后我自己查阅使用。Play 的Configuration文件规则并不复杂,但是中文资料不多,查起来给人东拼西凑的感觉,而官方文档讲的很不错,所以想翻译一下。

Play使用的配置文件是基于Typesafe config library

Play应用的配置文件一定会定义在conf/application.conf下.配置文件使用HOCON 语法格式

除了来自于文件application.conf的配置,Play应用的配置也可以来自于几个其他的文件

  • 默认的设置会从classpath中找到的任何reference.conf中加载。大多数Play的JAR包都包括一个带有默认设置的reference.conf文件。文件application.conf中的设置将会覆盖掉在reference.conf文件们中的设置
  • 我们也完全可以使用system properties去设置配置。System properties会覆盖掉application.conf文件中的设置

一个符合习惯的使用配置的做法是让所有的configuration keys都定义在某一个位置,要么定义在reference.conf要么定义在application.conf。如果那个对应的键没有一个合适的默认值,通常将这个键设置成null以表示它是no value的。

指定可选的其他配置文件

在运行时,默认的application.conf文件被从classpath中加载。System properties可以被用来强制设置一个不同的配置源:

  • config.resource这个System property可以具体指定一个带有后缀的资源名称,比如用application.conf而不能仅仅用application命名。
  • config.file这个System property可以具体指定一个文件系统路径,同样的它也应该包括文件扩展名,而不仅仅是一个basename

这些System properties可以具体指定一个application.conf配置文件的替代,而不是把这些文件加到application.conf中(译者:意思就是当使用config.file这种变量指定一个新的文件的时候,新的文件才是config文件,而不是说把新的文件和application.conf都作为配置文件,也不是说会把新配置文件加入到application.conf然后一起做配置文件)。如果你还是想要使用一些变量值在application.conf中,你就可以include那个application.conf在你自己指定的那个.conf文件中,怎么include进来呢?可以通过在你指定的那个conf文件的开头位置写下一行include "application"(译者测试写成inclue “application.conf”也可以)。当你把application.conf文件的设置都include进你自己的.conf文件中之后,你就可以具体设置任何你想要覆盖掉的在application.conf中的变量配置。

在你的Controller中使用Configuration

所有的configuration都可以在你的controller(或者你自己的组件)中使用,为了使用默认的配置或者是你自定义的配置,感谢依赖注入。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Scala
import javax.inject._
import play.api.Configuration

class MyController @Inject() (config: Configuration) {
// ...
}
Java
package controllers

import com.typesafe.config.Config;
import play.mvc.Controller;

import javax.inject.Inject;

public class MyController extends Controller {

private final Config config;

@Inject
public MyController(Config config) {
this.config = config;
}
}

配合Akka使用

Akka会使用那个在你Play application中定义的配置文件。这意味着你可以在application.conf文件夹中配置任何Akka中需要配置的东西。在Play中,Akka会从play.akka设置读取它的配置,而不是从akka设置中读取。

run命令配合使用

当你使用run命令运行你的play应用的时候,你需要了解几件比较特别的关于配置的事情

Extra devSettings

你可以在build.sbt文件中为run命令配置一些额外的设置,这些设置不会在你部署应用时被使用

1
PlayKeys.devSettings += "play.server.http.port" -> "8080"

application.conf中配置HTTP服务器设置

run模式下,Play的Http服务器部分会在应用被编译之前启动。这意味着当HTTP服务器启动时,HTTP服务器并不能获取到application.conf文件中的信息。当使用run启动应用命令时如果你想要覆盖HTTP服务器的一些设置,就不能使用application.conf做这种覆盖。取而代之的是,你或者可以使用system properties或者是使用devSettings设置(上一小节Extra devSettings提过的)。举一个设置服务器HTTP端口号的例子,想了解其他的服务器设置可以点击这里here.

1
> run -Dhttp.port=1234

如果你想要在开发模式下(这个模式和run命令一同使用)自定义对Akka的配置,有一个具体指明的namespace需要被添加。你需要在你的配置中配置PlayKeys.devSettings变量的值时,添加上play.akka.dev-mode。举个例子:

1
PlayKeys.devSettings += "play.akka.dev-mode.akka.cluster.log-info" -> "off"

当用来运行开发服务器的Akka ActorSystem和被应用本身使用的Akka ActorSystem发生冲突的时候,这就显得是非有用了。(原文:This is specially useful if there is some conflict between the Akka ActorSystem used to run the development server and the ActorSystem used by the application itself.

HOCON 语法

HOCON的语法和json语法非常相似,当然你可以在http://json.org/找到json的语法规则。

Unchanged from JSON

月月说要给我打赏,就还是放了二维码,😝