问题
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?
回答1:
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
回答2:
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