Как добиться директивы прекомпилятора как функциональность
Я разрабатываю угловое приложение, и рекомендуется использовать сгенерированный код для многих вещей, работающих в производственном процессе, а именно, для кешей шаблонов, кешей выражений и статического инжектора 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 ответ
Я вижу две возможности (еще не пробовал ни одного из них)
- Одним из них является использование преобразователя (см. также Передача пользовательских параметров в приложение dart при использовании pub serve для его запуска)
или же
- Устранение мертвого кода во время компиляции с помощью dart2js
Недавно должна была быть добавлена возможность, что сборка паба позволяет добавлять переменные окружения, используя параметр командной строки (например, -dart2js's -d)
log(String msg) {
if (const String.fromEnvironment('DEBUG') != null) {
print('debug: $msg');
}
}
main() {
log('In production, I do not exist');
}
Некоторые ссылки о трансформаторах:
- Можем ли мы построить это? Да мы можем!
- Активы и Трансформаторы
- День 992. Поиск и замена дротического трансформатора, чтобы спрятаться от полимера
- Дротические трансформаторы для очистки полимеров
- Паб трансформеры
- dart2js_dransformer.dart
- Документ определяемые пользователем преобразователи
РЕДАКТИРОВАТЬ
Я смог настроить 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
игнорируется в производстве.