Это мой первый вопрос по SE. Обычно я могу найти ответ на что-нибудь довольно легко через этот замечательный сайт, но, к сожалению, в этом случае я не могу найти ничего о том, что я ищу, ни здесь, ни где-либо еще. Позвольте мне объяснить проблему:
Я написал программу на C ++ для некоторых численных расчетов. Он принимает аргументы командной строки и пишет в стандартный вывод и прекрасно работает на моей системе под управлением OSX.
Я хочу разместить его в Интернете, чтобы мои коллеги могли его опробовать, поэтому я написал несколько кодов Node.js и Express, чтобы получить входные данные из формы и передать их в качестве аргумента командной строки исполняемому файлу. Затем я выполняю двоичный файл под названием «факторизатор» следующим образом:
const exec = require('child_process').exec;
app.post('/', function (req, res) {
var input = req.body.numberinput; //Number entered on the webpage
const child = exec('./numericcomp ' + input, {timeout: 20000}, function(error, stdout, stderr) {
//Code here writes stdout to the page
}
}
Вышеописанное прекрасно работает на моем локальном компьютере, но когда я развернул его в Heroku, а затем попытался ввести (здесь я попробовал 2131), я получаю ошибку:
Error: Command failed: ./numericcomp 2131 ./numericcomp: 3: ./numericcomp: Syntax error: word unexpected (expecting ")")
это дается для обратного вызова в exec.
Так что я действительно не знаю, что делать, проблема в том, что Heroku просто не запускает исполняемый файл должным образом. Я не особо разбираюсь в том, как работает Heroku, я прочитал информацию о buildpack-пакетах и т. Д., Но, кажется, очень сложно просто выполнить двоичный файл. Это потому, что у меня есть только один dyno, и он не может запустить дочерний процесс?
Я был бы очень благодарен, если бы кто-то мог указать мне правильное направление здесь, кажется, что я сделал всю тяжелую работу, но не могу преодолеть последнее препятствие.
Хорошо, у меня это работает, это может заинтересовать многих, поэтому я опубликую, как я это сделал.
Проблема заключалась в том, что архитектура Heroku не такая, как на моей машине, и, следовательно, скомпилированная программа просто не будет работать на Heroku. Чтобы обойти это, я создал make-файл для компиляции исходного кода C ++ и отправил его в Heroku, используя
$ git push heroku master
затем
$ heroku run bash
который по сути устанавливает оболочку bash с доступом к вашему экземпляру Heroku.
Отсюда скомпилируйте исполняемый файл, используя
$ make
затем scp
этот исполняемый файл обратно на локальный компьютер, а затем
$ git add .
$ git commit -m "added working executable"
а также
$ git push heroku master
Тогда рабочий исполняемый файл будет там в приложении Heroku и будет работать так же, как на локальном хосте.
Других решений пока нет …