如何实现预编译指令之类的功能

时间:2014-01-24 17:24:11

标签: dart dart-pub dart2js

我正在开发一个角度应用程序,建议将生成的代码用于生产中运行的很多东西,即模板缓存,表达式缓存和静态DI注入器。目前没有很好的方法在不同的构建配置之间切换,所以我使用的是推荐的模式here

  

在lib / main.dart中,您可以看到正在导入的initializer-prod.dart文件,该文件具有initializer-dev.dart对应文件。在这两个文件之间切换将允许您在prod和dev模式之间切换。在使用prod模式之前,您需要运行生成器脚本。

这导致以下导入:

//import 'initializer_prod.dart' as init; // Use in prod/test.
import 'initializer_dev.dart' as init; // Use in dev.

如您所见,切换导入是一个手动过程。是否有更好,更自动的方法来实现这一目标?

1 个答案:

答案 0 :(得分:2)

我看到两种可能性(我自己还没有尝试过这些)

log(String msg) {
  if (const String.fromEnvironment('DEBUG') != null) {
    print('debug: $msg');
  }
}

main() {
  log('In production, I do not exist');
}

有关变形金刚的一些链接:

修改
我能够在pubspec.yaml中配置dart2js选项,如

transformers:
- $dart2js:
    commandLineOptions: [-DDEBUG=true]
    environment:
      DEBUG: "true"
    suppressWarnings: true
    terse: true

如果提供了未知选项或者它不是预期的格式(pub build用于commandLineOptions,yaml list表单环境),它们将被验证并且yaml map失败 String.fromEnvironment()未获得值

根据此问题,支持: Passing in arguments to dart2js during pub build

我提交了一个错误How to pass options to dart2js from pubspec.yaml

修改-2

我尝试过它现在正在运作:

transformers: # or dev_transformers
- $dart2js:
  environment: { PROD: "true" }

等代码中访问它
String.fromEnvironment()

main() {
  print('PROD: ${const String.fromEnvironment('PROD')}'); 
  // works in the browser
  // prints 'PROD: null' in Dartium
  // prints 'PROD: true' in Chrome
}

另见Configuring the Built-in dart2js Transformer

修改-3

另一种方法是使用assert来设置变量。 生产中会忽略assert