首页 > 解决方案 > 在 Dart 中禁用 print()

问题描述

有没有办法禁用打印功能 Dart 代码或以某种方式拦截它?print(String)我们团队中的一些开发人员继续使用 print 而不是我们构建的记录器,这意味着我们在控制台中看到很多垃圾,除非我们对所有代码进行搜索替换以查找和替换,否则我们无法关闭这些垃圾log.info(String)

理想情况下,我们应该使用预提交挂钩来检查提交的代码是否包含打印,然后拒绝提交,但在代码级别阻止打印似乎更快。

// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

part of dart.core;

/// Prints a string representation of the object to the console.
void print(Object object) {
  String line = "$object";
  if (printToZone == null) {
    printToConsole(line);
  } else {
    printToZone(line);
  }
}

print是的一部分,是否可以通过代码或通过某些转换dart.core器覆盖任何内容?dart.corepubspec.yaml

如果没有,我想是时候设置预提交挂钩了。

标签: dart

解决方案


我认为最好的解决方案是像https://github.com/dart-lang/linter/issues/88这样的 linter 规则

与此同时,您可以在新区域中运行代码并覆盖那里的打印方法

https://api.dartlang.org/stable/1.24.3/dart-async/ZoneSpecification-class.html

https://api.dartlang.org/stable/1.24.3/dart-async/Zone/print.html

https://api.dartlang.org/stable/1.24.3/dart-async/PrintHandler.html

http://jpryan.me/dartbyexample/examples/zones/

import 'dart:async';

main() {
  // All Dart programs implicitly run in a root zone.
  // runZoned creates a new zone.  The new zone is a child of the root zone.
  runZoned(() async {
    await runServer();
  },
  // Any uncaught errors in the child zone are sent to the [onError] handler.
      onError: (e, stacktrace) {
    print('caught: $e');
  },
  // a ZoneSpecification allows for overriding functionality, like print()
    zoneSpecification: new ZoneSpecification(print: (Zone self, ZoneDelegate parent, Zone zone, String message) {
      parent.print(zone, '${new DateTime.now()}: $message');
    })
  );
}

并在发布模式下隐藏打印

main() {
   runZonedGuarded(() {
   runApp(MyApp());
 }, (error, stackTrace) {
   print(stackTrace);
 }, zoneSpecification: new ZoneSpecification(
     print: (Zone self, ZoneDelegate parent, Zone zone, String message){
   // parent.print(zone, '${new DateTime.now()}: $message');
   /**
    * Print only in debug mode
    * */
   if (kDebugMode) {
     parent.print(zone, message);
   }
 }));
}

推荐阅读