The title says it all. I'm trying to create a Windows exe file using npm pkg (details here). I've succeeded in creating the exe file, but it only runs when located in my project folder. I'd like to be able to run it from anywhere - even other computers. What am I doing wrong?
EDIT: Here is my script. Would using _dirname help? I'm not familiar with that function, so code samples would be appreciated.
var AWS = require('aws-sdk'),
fs = require('fs');
const Fs = require('fs')
const path = require('path');
AWS.config.loadFromPath(path.join(__dirname, 'config.json'));
var mysql = require('mysql');
var connection = mysql.createConnection({
connectionLimit : 10,
host : '...',
user : '...',
password : '...',
database: '...',
});
console.log(__dirname);
var localfile = path.join(__dirname, 'myverse.mp3')
connection.query('SELECT COUNT(mp3) as "total" FROM myverses where mp3 = "empty"', function (error, results, fields) {
console.log('error: ' + error);
var totalverses = results[0].total
if (totalverses > 0) {
console.log('There are ' + results[0].total + ' verses to record.');
addverse();
} else {
console.log("There are NO verses to record.")
connection.end();
}
});
function addanother() {
connection.query('SELECT COUNT(mp3) as "total" FROM myverses where mp3 = "empty"', function (error, results, fields) {
console.log('error: ' + error);
var totalverses = results[0].total
if (totalverses > 0) {
console.log('There are ' + results[0].total + ' verses to record.');
addverse();
} else {
console.log("There are NO verses to record.")
connection.end();
}
});
}
function addverse() {
connection.query('SELECT versetext, book, mp3, id, reference FROM myverses where mp3 = "empty" limit 1',
function (error, results, fields) {
console.log(error);
var scripture = results[0].versetext;
var book = results[0].book;
var reference = results[0].reference.replace(":", " verse ");
console.log(scripture + " " + book.replace("1", "first").replace("2", "second").replace("3", "third") + " " + reference);
var myverse = "<speak><break time='1s'/>" + scripture + " " + book.replace("1", "first").replace("2", "second").replace("3", "third") + " " + reference + "<break time='1s'/></speak>";
var link = "https://s3.amazonaws.com/myverses/" + book.replace(/ /g, "")+reference.replace(/ /g, "")+".mp3";
writeit();
var myvalue = fs.createReadStream(localfile);
setTimeout(uploadit, 2000)
function linkit(){
connection.query('update myverses set mp3 = ? where mp3 = "empty" limit 1', [link],
function (error, results, fields) {
console.log(error)
})
}
function writeit() {
const Polly = new AWS.Polly({
signatureVersion: 'v4',
region: 'us-east-1'
})
let params = {
'Text': myverse.replace(" Job ", " Jobe "),
'TextType': 'ssml',
'OutputFormat': 'mp3',
'VoiceId': 'Matthew'
}
Polly.synthesizeSpeech(params, (err, data) => {
if (err) {
console.log(err.code)
} else if (data) {
if (data.AudioStream instanceof Buffer) {
Fs.writeFile(localfile, data.AudioStream, function(err) {
if (err) {
return console.log(err)
}
console.log("Verse recorded successfully!")
})
}
}
})
}
function uploadit () {
console.log('Preparing to upload the verse.')
s3 = new AWS.S3({apiVersion: '2006-03-01'});
var uploadParams = {Bucket: 'myverses', key: '/test.mp3', Body: myvalue, ACL: 'public-read'};
var file = localfile;
var fs = require('fs');
var fileStream = fs.createReadStream(file);
fileStream.on('error', function(err) {
console.log('File Error', err);
});
uploadParams.Body = fileStream;
var path = require('path');
uploadParams.Key = book.replace(/ /g, "")+reference.replace(/ /g, "")+".mp3";
// call S3 to retrieve upload file to specified bucket
s3.upload (uploadParams, function (err, data) {
if (err) {
console.log("Error", err);
} if (data) {
console.log("Upload Success", data.Location);
linkit();
addanother();
}
});
}
});
}
__dirnamewhen referencing files inside your project.node_modulesfolder to the desktop as well. It seems the .exe is referencing the dependencies rather than building them into the file. I'm using the aws and mysql modules. How can I make sure these are included in the .exe?