Commit 4d583856 by Marcin Cieslak Committed by xzyfer

Introduce SASS_BINARY_SITE environment variable

Provide ability to locally mirror node-sass
binaries for various versions and platforms.

SASS_BINARY_SITE needs to be an URL pointing to
a collection of files organized like the Github
repository.

If SASS_BINARY_SITE is set to

 http://myhost:8080/local/node-sass-bin/

then

 http://myhost:8080/local/node-sass-bin/v3.0.0-beta.5/freebsd-x64-14_binding.node

should point to the FreeBSD 64 bit binary for node 0.12.0

The URL can be also specified as the --sass-binary-site
commandline option or in the package.json:

 "nodeSassConfig": {
   "binarySite": <url>
 }

Remove --sass-binary-url and friends.

Also change priority and use package.json defaults
last, after command line arguments and the environment.
parent b28c68f0
...@@ -50,7 +50,7 @@ function getRuntimeInfo() { ...@@ -50,7 +50,7 @@ function getRuntimeInfo() {
/** /**
* Get binary name. * Get binary name.
* If environment variable SASS_BINARY_NAME or * If environment variable SASS_BINARY_NAME or
* process aurgument --binary-name is provide, * process argument --binary-name is provided,
* return it as is, otherwise make default binary * return it as is, otherwise make default binary
* name: {platform}-{arch}-{v8 version}.node * name: {platform}-{arch}-{v8 version}.node
* *
...@@ -62,10 +62,10 @@ function getBinaryName() { ...@@ -62,10 +62,10 @@ function getBinaryName() {
if (flags['--sass-binary-name']) { if (flags['--sass-binary-name']) {
binaryName = flags['--sass-binary-name']; binaryName = flags['--sass-binary-name'];
} else if (package.nodeSassConfig && package.nodeSassConfig.binaryName) {
binaryName = package.nodeSassConfig.binaryName;
} else if (process.env.SASS_BINARY_NAME) { } else if (process.env.SASS_BINARY_NAME) {
binaryName = process.env.SASS_BINARY_NAME; binaryName = process.env.SASS_BINARY_NAME;
} else if (package.nodeSassConfig && package.nodeSassConfig.binaryName) {
binaryName = package.nodeSassConfig.binaryName;
} else { } else {
binaryName = [process.platform, '-', binaryName = [process.platform, '-',
process.arch, '-', process.arch, '-',
...@@ -76,21 +76,37 @@ function getBinaryName() { ...@@ -76,21 +76,37 @@ function getBinaryName() {
} }
/** /**
* Retrieve the URL to fetch binary. * Determine the URL to fetch binary file from.
* If environment variable SASS_BINARY_URL * By default feth from the node-sass distribution
* is set, return that path. Otherwise make * site on GitHub.
* path using current release version and *
* binary name. * The default URL can be overriden using
* the environment variable SASS_BINARY_SITE
* or a command line option --sass-binary-site:
*
* node scripts/install.js --sass-binary-site http://example.com/
*
* The URL should to the mirror of the repository
* laid out as follows:
*
* SASS_BINARY_SITE/
*
* v3.0.0-beta.4
* v3.0.0-beta.4/freebsd-x64-14_binding.node
* ....
* v3.0.0-beta.5
* v3.0.0-beta.5/freebsd-ia32-11_binding.node
* v3.0.0-beta.5/freebsd-x64-42_binding.node
* ... etc. for all supported versions and platforms
* *
* @api private * @api private
*/ */
function getBinaryUrl() { function getBinaryUrl() {
return flags['--sass-binary-url'] || var site = flags['--sass-binary-site'] ||
package.nodeSassConfig ? package.nodeSassConfig.binaryUrl : null || process.env.SASS_BINARY_SITE ||
process.env.SASS_BINARY_URL || package.nodeSassConfig.binarySite;
['https://github.com/sass/node-sass/releases/download/v', return [site, 'v' + package.version, sass.binaryName].join('/');
package.version, '/', sass.binaryName].join('');
} }
/** /**
...@@ -118,7 +134,7 @@ sass.versionInfo = getVersionInfo(); ...@@ -118,7 +134,7 @@ sass.versionInfo = getVersionInfo();
/** /**
* Get binary path. * Get binary path.
* If environment variable SASS_BINARY_PATH or * If environment variable SASS_BINARY_PATH or
* process aurgument --binary-path is provide, * process argument --sass-binary-path is provided,
* select it by appending binary name, otherwise * select it by appending binary name, otherwise
* make default binary path using binary name. * make default binary path using binary name.
* Once the primary selection is made, check if * Once the primary selection is made, check if
...@@ -134,10 +150,10 @@ sass.getBinaryPath = function(throwIfNotExists) { ...@@ -134,10 +150,10 @@ sass.getBinaryPath = function(throwIfNotExists) {
if (flags['--sass-binary-path']) { if (flags['--sass-binary-path']) {
binaryPath = flags['--sass-binary-path']; binaryPath = flags['--sass-binary-path'];
} else if (package.nodeSassConfig && package.nodeSassConfig.binaryPath) {
binaryPath = package.nodeSassConfig.binaryPath;
} else if (process.env.SASS_BINARY_PATH) { } else if (process.env.SASS_BINARY_PATH) {
binaryPath = process.env.SASS_BINARY_PATH; binaryPath = process.env.SASS_BINARY_PATH;
} else if (package.nodeSassConfig && package.nodeSassConfig.binaryPath) {
binaryPath = package.nodeSassConfig.binaryPath;
} else { } else {
binaryPath = path.join(__dirname, '..', 'vendor', sass.binaryName.replace(/_/, '/')); binaryPath = path.join(__dirname, '..', 'vendor', sass.binaryName.replace(/_/, '/'));
} }
......
...@@ -18,6 +18,9 @@ ...@@ -18,6 +18,9 @@
"node": ">=0.10.0" "node": ">=0.10.0"
}, },
"main": "lib/index.js", "main": "lib/index.js",
"nodeSassConfig": {
"binarySite": "https://github.com/sass/node-sass/releases/download"
},
"bin": { "bin": {
"node-sass": "bin/node-sass" "node-sass": "bin/node-sass"
}, },
......
...@@ -20,22 +20,25 @@ require('../lib/extensions'); ...@@ -20,22 +20,25 @@ require('../lib/extensions');
*/ */
function download(url, dest, cb) { function download(url, dest, cb) {
applyProxy({ rejectUnauthorized: false }, function(options) { var returnError = function(err) {
var returnError = function(err) { cb(typeof err.message === 'string' ? err.message : err);
cb(typeof err.message === 'string' ? err.message : err); };
}; if (url) {
applyProxy({ rejectUnauthorized: false }, function(options) {
request.get(url, options).on('response', function(response) { request.get(url, options).on('response', function(response) {
if (response.statusCode < 200 || response.statusCode >= 300) { if (response.statusCode < 200 || response.statusCode >= 300) {
returnError(['Can not download file from:', url].join()); returnError(['Can not download file from:', url].join());
return; return;
} }
response.pipe(fs.createWriteStream(dest)); response.pipe(fs.createWriteStream(dest));
cb(); cb();
}).on('error', returnError); }).on('error', returnError);
}); });
} else {
returnError('Download URL not defined, set SASS_BINARY_SITE in the environment to enable download.');
}
} }
/** /**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment