【问题标题】:How to achieve precompiler directive like functionality如何实现类似功能的预编译器指令
【发布时间】:2014-02-15 19:15:17
【问题描述】:

我正在开发一个 Angular 应用程序,建议将生成的代码用于生产中运行的很多东西,即模板缓存、表达式缓存和静态 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.

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

【问题讨论】:

    标签: dart dart-pub dart2js


    【解决方案1】:

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

    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
    

    如果提供了未知选项或它不是预期的格式(yaml list 用于 commandLineOptions,yaml map 表单环境),则它们已验证,pub build 失败
    但是 @987654341 @没有得到值

    根据这个问题,这是支持的: Passing in arguments to dart2js during pub build

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

    EDIT-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

    EDIT-3

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

    【讨论】:

    • 关于选项 2) pub build 目前不支持仅通过直接调用 dart2js。见:dartbug.com/15806
    • 我没有使用 pub serve,但在 dart2dart/dart2js 编译之前应用转换可能会奏效。您是否知道直接应用转换而不是通过 pub serve 应用转换的任何示例?
    • 我刚试了一下,效果很好。我发布了一个示例项目github.com/zoechi/build_variables/blob/master/pubspec.yaml#L15
    猜你喜欢
    • 1970-01-01
    • 2011-01-16
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 2011-01-15
    • 1970-01-01
    相关资源
    最近更新 更多