Как добиться директивы прекомпилятора как функциональность

Я разрабатываю угловое приложение, и рекомендуется использовать сгенерированный код для многих вещей, работающих в производственном процессе, а именно, для кешей шаблонов, кешей выражений и статического инжектора 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.

Как видите, переключение импорта происходит вручную. Есть ли лучший, более автоматический способ добиться этого?

1 ответ

Решение

Я вижу две возможности (еще не пробовал ни одного из них)

или же

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() не получил значение

В соответствии с этой проблемой это поддерживается: передача аргументов dart2js во время сборки паба

Я подал ошибку Как передать параметры в dart2js из 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

РЕДАКТИРОВАТЬ-3

Другой способ заключается в использовании assert установить переменные. assert игнорируется в производстве.

Другие вопросы по тегам