Dart http_server, обслуживающий index.html, но не извлекающий зависимости

Привет, я пытаюсь создать веб-приложение, в котором вы можете получить доступ к файлам в системе через веб-браузер. Структура веб-приложения выглядит следующим образом:

командир

  cmdr
       packages
       lib
       cmdr.dart

  gui
      packages
      web
            assets
            css
            console.dart
            editor.dart
            client.dart
            explorer.dart
            index.html

cmdr.dart — это сервер, и я инициирую http_server для размещения на нем index.html. Индекс извлекает файл client.dart как скрипт. Файлы editor.dart, console.dart и explorer.dart являются частью файла клиента.

Проблема в том, что когда я запускаю http_server для хоста index.html, он не получает доступ к файлам клиента. Большинство зависимостей не извлекаются, за исключением файлов CSS. Кроме того, я подумал, что, возможно, компиляция в javascript решит эту проблему, поскольку она объединит весь код в один файл. Однако существует та же проблема, когда HTML-код собирается, но ни один из клиентских компонентов не создается.

Код моего сервера выглядит следующим образом:

// Setting up Virtual Directory

VirtualDirectory virDir;

void directoryHandler(dir, request) {
  var indexUri = new Uri.file(dir.path).resolve('index.html');
  virDir.serveFile(new File(indexUri.toFilePath()), request);
}

void main(List<String> args) {
  // Set default dir as current working directory.
  Directory dir = Directory.current;

  // Creating Virtual Directory
  virDir = new VirtualDirectory(Platform.script.resolve('/Users/donghuynh/git/commander/gui/web').toFilePath())
      ..allowDirectoryListing = true
      ..directoryHandler = directoryHandler
      ..followLinks = true;

  // Set up logging.
  log = new Logger('server');
  Logger.root.onRecord.listen(new SyncFileLoggingHandler("server.log"));

  // Create an args parser to override the workspace directory if one is supplied.
  var parser = new ArgParser();
  parser.addOption('directory', abbr: 'd', defaultsTo: Directory.current.toString(), callback: (directory) {
    dir = new Directory(directory);
  });
  parser.parse(args);

  // Initialize the DirectoryWatcher.
  watcher = new DirectoryWatcher(dir.path);

  // Set up an HTTP webserver and listen for standard page requests or upgraded
  // [WebSocket] requests.
  HttpServer.bind(InternetAddress.ANY_IP_V4, 8080).then((HttpServer server) {
    log.info("HttpServer listening on port:${server.port}...");
    server.listen((HttpRequest request) {
      // WebSocket requests are considered "upgraded" HTTP requests.
      if (WebSocketTransformer.isUpgradeRequest(request)) {
        log.info("Upgraded ${request.method} request for: ${request.uri.path}");
        WebSocketTransformer.upgrade(request).then((WebSocket ws) {
          handleWebSocket(ws, dir);
        });
      } else {
        log.info("Regular ${request.method} request for: ${request.uri.path}");
        // TODO: serve regular HTTP requests such as GET pages, etc.
        virDir.serveRequest(request);
      }
    });
  });
}

При доступе к index.html через веб-браузер я получаю следующие ошибки:

http://localhost:8080/packages/bootjack/css/bootstrap.min.css Failed to load resource: the server responded with a status of 404 (Not Found)
http://localhost:8080/packages/ace/src/js/ext-language_tools.js Failed to load resource: the server responded with a status of 404 (Not Found)
http://localhost:8080/packages/ace/src/js/ace.js Failed to load resource: the server responded with a status of 404 (Not Found)
http://localhost:8080/packages/browser/dart.js Failed to load resource: the server responded with a status of 404 (Not Found)
http://localhost:8080/packages/bootjack/css/bootstrap.min.css Failed to load resource: the server responded with a status of 404 (Not Found)

Файлы на самом деле существуют в этих местах (хотя и связаны символом), но по какой-то причине они не извлекаются.

-Дон


person user3317470    schedule 17.12.2014    source источник
comment
Я сомневаюсь, что Platform.script.resolve имеет смысл использовать абсолютный путь. Почему вы его используете?   -  person Günter Zöchbauer    schedule 21.12.2014
comment
Когда вы строите на JavaScript, обычно есть более одного выходного файла, но у вас больше нет символических ссылок (хотя вам нужно обслуживать каталог build/web вместо web).   -  person Günter Zöchbauer    schedule 21.12.2014


Ответы (1)


Насколько я помню, вам нужно передать дополнительный аргумент VirtualDirectory для перехода по символическим ссылкам.

В любом случае вы не должны напрямую обслуживать исходный код Dart, а вместо этого вывод из pub build (по крайней мере, для производства). Для разработки перенаправление запросов на работающий экземпляр pub serve, вероятно, лучше, а также официально предложенный способ.

person Günter Zöchbauer    schedule 17.12.2014