Как правильно обрабатывать относительные пути в скрипте для Phantom. js (для fs.read, fs.write, page.open)? - PullRequest
0 голосов
/ 15 марта 2020

Я рефакторинг старого набора инструментов сборки, который использует Phantom. js.

Новая сборка. js сценарий для node.js, который я написал (воспроизводит поведение старого. скрипт bat) имеет следующие последние строки в конце:

console.log('\n' + 'BUILD: creating EMPTY.HTML and INDEX.XML from INDEX.HTML');
process.env['TIDDLYWIKI_RELEASE'] = releaseVersion;
process.env['TIDDLYWIKI_BUILD_CONTEXT_PATH'] = __dirname;
output = exec(browserPath + ' ' + joinPath(__dirname, 'phantom_driver.js'));
console.log(output.toString());

console.log('BUILD: done');

и работает как положено, когда вызывается так: node build.js в своей папке.

Теперь я пытаюсь сделать это работать также из любой другой папки (например, из родительской папки, например: node build/build.js, и в конечном итоге она будет частью скрипта npm run build). Проблема в том, что когда я запускаю node build/build.js, сценарий никогда не заканчивается (без вывода после BUILD: creating EMPTY.HTML and INDEX.XML from INDEX.HTML). Слегка адаптированный phantom_driver.js выглядит следующим образом (еще не рефакторинг):

var fs = require('fs'),
    releaseVersion = require('system').env['TIDDLYWIKI_RELEASE'],
    pathOfCooked = "cooked/" + releaseVersion,          // !
    original = fs.read(pathOfCooked + "/index.html");   // !

var page = require('webpage').create();
page.viewportSize = { width: 1024, height: 800 };
page.open(pathOfCooked + "/index.html", function () {   // !

    var result = page.evaluate(function(original) {

        // some path unrelated stuff here

    }, original);

    if(typeof result === "string") {
        console.log("Error: " + result);
    } else {
        // Save the files
        fs.write(pathOfCooked + "/index.html", result.revised, "w"); // !
        fs.write(pathOfCooked + "/empty.html", result.empty, "w");   // !
        fs.write(pathOfCooked + "/index.xml",  result.rss, "w");     // !   
    }

    phantom.exit();
});

Опять же, когда я запускаю node build.js фантом. js часть работает, как и ожидалось, когда я запускаю node build/build.js, эта часть не работает. В настоящее время я не уверен, как я могу отладить это, так как даже добавление console.log('inside phantom script'); в начале phantom_driver.js не дает никакого вывода. 6 строк, отмеченных // !, относятся к относительным адресам, и, вероятно, их следует изменить, чтобы устранить проблему. Добавление

const joinPath = require('path').join;

само по себе приводит к сбою сценария («зависание»). Я также пытался передавать рассчитанные пути через отдельный build_settings. js, но простое добавление

const {
    releaseVersion,
    destinationRelativePath
} = require('./build_settings.js');

также приводит к сбою сценария. В настоящее время я пытаюсь сделать эту работу, вычисляя различные виды абсолютных путей (OS-Speci c, Unix -тиля или веб-стиль file://...) для этих fs.read, fs.write и page.open (и используя env для прохождения абсолютного пути от build.js), например:

contextPath = env['TIDDLYWIKI_BUILD_CONTEXT_PATH'],
pathOfCooked = contextPath + '/' + "cooked/" + releaseVersion, // I've also tried to subsititute all hardcoded '/' in paths with '\\'

, но делать это вслепую не кажется хорошей идеей. Не могли бы вы подсказать, как именно фантом. js разрешает эти относительные пути, почему происходит сбой при попытке require('path') и как заставить build.js работать при вызове из другой папки?

PS некоторые полезные заметки (пока не полное решение)

  1. fs.write - хороший инструмент для отладки, по крайней мере, мы можем получить некоторые значения и проверить, насколько далеко выполнено пошел

  2. фантом не реализует __dirname, но имеет аналогичное значение phantom.libraryPath. Они утверждают, что фантом имеет собственную реализацию require, но я не нашел подтверждения того, что

  3. phantom.libraryPath + 'cooked/' + releaseVersion - хороший метод для вызова c абсолютных путей для fs.read и fs.write; однако page.open не работает с ним

  4. page.open сработало после добавления 'file:///' к пути; Я еще не уверен, является ли это кроссплатформенным решением: добавление 'file:////' разбивает вещи на Windows, и если phantom.libraryPath начинается с / на Unix (в то время как оно начинается с C:/ на Windows), 'file:///' + phantom.libraryPath даст дополнительный ведущий сл sh и, вероятно, потерпит неудачу

...