2

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

在 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.

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

4

1 回答 1

2

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

或者

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

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

关于变压器的一些链接:

编辑
我能够dart2js在 pubspec.yaml 中配置选项,例如

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

pub build如果提供了未知选项或者它不是预期的格式(yaml list对于 commandLineOptions,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
}

另请参阅配置内置 dart2js 转换器

EDIT-3

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

于 2014-01-24T18:00:56.167 回答