Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compiling coffeescript on npm install

I'm building an app consisting of private npm repos built in CoffeeScript. To keep deployment language-agnostic, and allow each app to specify its version of CoffeeScript, I'm including CoffeeScript as a dependency in each library, and building into JavaScript upon npm installation.

npm installation works fine for standalone repos, but fails when I try to install a repo that depends on another repo being built.

So if I have repo-a, whose package.json includes this:

"dependencies": {
  "coffee-script": "~1.2.0"
},
"scripts": {
  "install": "./node_modules/coffee-script/bin/cake install"
}

and repo-b, whose package.json includes this:

"dependencies": {
  "coffee-script": "~1.2.0",
  "repo-a": "git+ssh://[email protected]:myrepo.git"
},
"scripts": {
  "install": "./node_modules/coffee-script/bin/cake install"
}

where both have a Cakefile that looks like this, with an install task called on an npm install hook:

{print} = require "util"
{spawn} = require "child_process"

coffee = "./node_modules/coffee-script/bin/coffee"

echo = (child) ->
  child.stdout.on "data", (data) -> print data.toString()
  child.stderr.on "data", (data) -> print data.toString()
  child

install = (cb) ->
  console.log "Building..."
  echo child = spawn coffee, ["-c", "-o", "lib", "src"]
  child.on "exit", (status) -> cb?() if status is 0

task "install", "Install, build, and test repo", install

npm install works for for repo-a, but fails for repo-b with this message:

sh: ./node_modules/coffee-script/bin/cake: No such file or directory

at which point an unfinished ___coffee-script.npm directory exists in node_modules.

Of course it would be much easier to use a app.js wrapper, but I need to deploy JavaScript, not CoffeeScript. Can anyone tell me how I could get this to work?

like image 878
Jed Schmidt Avatar asked Dec 21 '11 15:12

Jed Schmidt


People also ask

Should you use CoffeeScript?

CoffeeScript is something that makes even good JavaScript code better. CoffeeScript compiled code can do everything that natively written JavaScript code can, only the code produced by using CoffeeScript is way shorter, and much easier to read.

Is CoffeeScript alive?

As of today, January 2020, CoffeeScript is completely dead on the market (though the GitHub repository is still kind of alive).


2 Answers

Two things.

  1. If you're running cake from an npm command, you can just specify cake install or cake build as the scripts.install field. This will run after coffee-script has been installed locally, and its bin linked appropriately (with a shim on windows), and will run with a PATH environ such that the locally installed cake is used rather than anything else in the system path.
  2. If you're not running this from an npm command, but you are nonetheless expecting that coffee-script has already been installed locally via npm (which it looks like), then you should probably be hitting ./node_modules/.bin/cake or ./node_modules/.bin/coffee rather than diving into the package internals.

If you are not installing coffee-script with npm, but instead using some git submodules or something, then you're on your own :)

like image 69
isaacs Avatar answered Oct 21 '22 13:10

isaacs


I would recommend to locally build the JS and store the compiled packages as tar.gz files on S3. For local development you can npm link and in production you point to the archive urls. If you don't want to version your dependencies you could just have the same url updated over and over.

Keep in mind this npm bug so: https://github.com/isaacs/npm/issues/1727 (you'll basically have to wipe your node_modules folder everytime you update the deps on an app that uses git/http urls as version numbers).

--fg

like image 21
Felix Geisendörfer Avatar answered Oct 21 '22 13:10

Felix Geisendörfer