Я рефакторинг старого набора инструментов сборки, который использует 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 некоторые полезные заметки (пока не полное решение)
fs.write
- хороший инструмент для отладки, по крайней мере, мы можем получить некоторые значения и проверить, насколько далеко выполнено пошел
фантом не реализует __dirname
, но имеет аналогичное значение phantom.libraryPath
. Они утверждают, что фантом имеет собственную реализацию require
, но я не нашел подтверждения того, что
phantom.libraryPath + 'cooked/' + releaseVersion
- хороший метод для вызова c абсолютных путей для fs.read
и fs.write
; однако page.open
не работает с ним
page.open
сработало после добавления 'file:///'
к пути; Я еще не уверен, является ли это кроссплатформенным решением: добавление 'file:////'
разбивает вещи на Windows, и если phantom.libraryPath
начинается с /
на Unix (в то время как оно начинается с C:/
на Windows), 'file:///' + phantom.libraryPath
даст дополнительный ведущий сл sh и, вероятно, потерпит неудачу