How to read file from an imported library

后端 未结 2 864
小蘑菇
小蘑菇 2021-01-21 05:51

I have two packages: webserver and utils which provides assets to webserver.

The webserver needs access to static files inside uti

2条回答
  •  别那么骄傲
    2021-01-21 06:41

    I tend to use Platform.script or mirrors to find the main package top folder (i.e. where pubspec.yaml is present) and find imported packages exported assets. I agree this is not a perfect solution but it works

    import 'dart:io';
    import 'package:path/path.dart';
    
    String getProjectTopPath(String resolverPath) {
      String dirPath = normalize(absolute(resolverPath));
    
      while (true) {
        // Find the project root path
        if (new File(join(dirPath, "pubspec.yaml")).existsSync()) {
          return dirPath;
        }
        String newDirPath = dirname(dirPath);
    
        if (newDirPath == dirPath) {
          throw new Exception("No project found for path '$resolverPath");
        }
        dirPath = newDirPath;
      }
    }
    
    String getPackagesPath(String resolverPath) {
      return join(getProjectTopPath(resolverPath), 'packages');
    }
    
    class _TestUtils {}
    
    main(List arguments) {
      // User Platform.script - does not work in unit test
      String currentScriptPath = Platform.script.toFilePath();
      String packagesPath = getPackagesPath(currentScriptPath);
      // Get your file using the package name and its relative path from the lib folder
      String filePath = join(packagesPath, "utils", "static.html");
      print(filePath);
    
      // use mirror to find this file path
      String thisFilePath =  (reflectClass(_TestUtils).owner as LibraryMirror).uri.toString();
      packagesPath = getPackagesPath(thisFilePath);
      filePath = join(packagesPath, "utils", "static.html");
      print(filePath);
    }
    

    To note that since recently Platform.script is not reliable in unit test when using the new test package so you might use the mirror tricks that I propose above and explained here: https://github.com/dart-lang/test/issues/110

提交回复
热议问题