2015-07-08 4 views
3

У меня есть два пакета: webserver и utils, который предоставляет активы веб-серверу.Как читать файл из импортированной библиотеки

webserver нуждается в доступе к статическим файлам внутри utils. Поэтому у меня есть эта установка:

utils/ 
    lib/ 
    static.html 

Как я могу получить доступ к static.html файл в одном из моих дротиков скриптов в webserver?

EDIT: Я пытался до сих пор использовать зеркала, чтобы получить путь к библиотеке и прочитать их оттуда. Проблема с этим подходом заключается в том, что если utils включен в package:, то url, возвращенный currentMirrorSystem().findLibrary(#utils).uri, является пакетом uri, который не может быть преобразован в реальный объект файла.

+0

Единственный ответ, связанный с моей проблемой, которую я мог найти, это: http://stackoverflow.com/questions/12627005/reading-static-files-under-a-library-in-dart и он полностью устарел (а также не работает в моем случае). – enyo

ответ

4

Используйте класс ресурсов, новый класс в Dart SDK 1.12.

Пример использования:

var resource = new Resource('package:myapp/myfile.txt'); 
var contents = await resource.loadAsString(); 
print(contents); 

Это работает на виртуальной машине, а 1,12.

Тем не менее, это не касается непосредственно вашей потребности, чтобы добраться до фактического объекта File, из пакета: URI. Учитывая класс ресурсов сегодня, вам нужно будет маршрутизировать байты с loadAsString() в объект Response HTTP-сервера.

1

Я, как правило, использую Platform.script или зеркала, чтобы найти главную папку верхнего пакета (т. Е. Где присутствует pubspec.yaml) и найти импортированные пакеты экспортированных активов. Я согласен, это не идеальное решение, но оно работает

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<String> 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); 
} 

отметить, что с недавнего времени Platform.script не является надежным в единичном испытании при использовании нового пакета теста, вы можете использовать зеркальные приемы, которые я предлагаю выше и поясняется здесь: https://github.com/dart-lang/test/issues/110

+1

К сожалению, это не работает с 'pub run test', потому что он« ломает »' Platform.script'. – enyo

Смежные вопросы