Let's say I have simple logger:
void main() {
var logger = new MyLogger();
logger.log("hello Dart");
}
I want this code to run in the dev mode (VM checked mode) but i don't want it in my production code. And i want it to be "tree shaked" away with the dart2js compiler. Is there some standard way?
Günter Zöchbauer
You could embed the code in an assert. Assertions are ignored in production code and I'm sure not built to JS when pub build is run in release mode.
class X {
X() {
print('x created');
}
void log(String m) {
print(m);
}
}
bool log(String m) {
new X()..log(m);
return true;
}
void main() {
assert(() {
new X()..log('in Assert');
return true;
});
assert(() => log('in Assert')); // use a wrapper function
}
When you create a wrapper method that returns true than you don't have to do it explicit each time.
You can also take a look at this question How to achieve precompiler directive like functionality
I put @GünterZöchbauer "assert trick" inside the factory constructor:
class _ProductionPlug implements DebugClass{
const _ProductionPlug();
noSuchMethod(_) {} //do nothing
}
class DebugClass{
static final DebugClass _plug = const _ProductionPlug();
log(msg){print(msg);}
DebugClass._(){}
factory DebugClass(){
DebugClass instance;
assert((){
instance = new DebugClass._();
return true;
});
return instance != null ? instance : _plug;
}
}
void main() {
print("hello");
new DebugClass()
..log("debugging");
}
This way nothing sticks out.
来源:https://stackoverflow.com/questions/24208213/how-to-exclude-debug-code