Skip to content
This repository has been archived by the owner on Jul 4, 2023. It is now read-only.

Commit

Permalink
node: install npm using tarball.
Browse files Browse the repository at this point in the history
Install npm to the expected location using the upstream tarball. This
should make everyone happier.

Closes #27479.
  • Loading branch information
MikeMcQuaid committed Apr 4, 2014
1 parent 2803df4 commit f900829
Showing 1 changed file with 32 additions and 57 deletions.
89 changes: 32 additions & 57 deletions Library/Formula/node.rb
Original file line number Diff line number Diff line change
@@ -1,34 +1,5 @@
require 'formula'

class NpmRequirement < Requirement
fatal true

def modules_folder
"#{HOMEBREW_PREFIX}/lib/node_modules"
end

def message; <<-EOS.undent
Beginning with 0.8.0, this recipe now comes with npm.
It appears you already have npm installed at #{modules_folder}/npm.
To use the npm that comes with this recipe, first uninstall npm with
`npm uninstall npm -g`, then run this command again.
If you would like to keep your installation of npm instead of
using the one provided with homebrew, install the formula with
the `--without-npm` option.
EOS
end

satisfy :build_env => false do
begin
path = Pathname.new("#{modules_folder}/npm/bin/npm")
path.realpath.to_s.include?(HOMEBREW_CELLAR)
rescue Errno::ENOENT
true
end
end
end

# Note that x.even are stable releases, x.odd are devel releases
class Node < Formula
homepage 'http://nodejs.org/'
Expand All @@ -46,56 +17,58 @@ class Node < Formula
option 'without-npm', 'npm will not be installed'
option 'without-completion', 'npm bash completion will not be installed'

depends_on NpmRequirement => :recommended
depends_on :python

fails_with :llvm do
build 2326
end

def install
args = %W{--prefix=#{prefix}}
resource "npm" do
url "http://registry.npmjs.org/npm/-/npm-1.4.6.tgz"
sha1 "0e151bce38e72cf2206a6299fa5164123f04256e"
end

def install
args = %W{--prefix=#{prefix} --without-npm}
args << "--debug" if build.include? 'enable-debug'
args << "--without-npm" if build.without? "npm"

system "./configure", *args
system "make install"
system "make", "install"

resource("npm").stage libexec/"npm" if build.with? "npm"
end

if build.with? "npm"
(lib/"node_modules/npm/npmrc").write("prefix = #{npm_prefix}\n")
def post_install
return if build.without? "npm"

# Link npm manpages
Pathname.glob("#{lib}/node_modules/npm/man/*") do |man|
dir = send(man.basename)
man.children.each { |file| dir.install_symlink(file) }
end
node_modules = HOMEBREW_PREFIX/"lib/node_modules"
node_modules.mkpath
cp_r libexec/"npm", node_modules

if build.with? "completion"
bash_completion.install_symlink \
lib/"node_modules/npm/lib/utils/completion.sh" => "npm"
end
npm_root = node_modules/"npm"
npmrc = npm_root/"npmrc"
npmrc.delete if npmrc.exist?
npmrc.write("prefix = #{HOMEBREW_PREFIX}\n")

npm_root.cd { system "make", "install" }
system "#{HOMEBREW_PREFIX}/bin/npm", "update", "npm", "-g"

This comment has been minimized.

Copy link
@mietek

mietek Aug 26, 2014

Contributor

This is problematic. According to @othiym23, there was a bug in npm before about 1.4.23 where npm -g update would ignore the latest distribution tag in favor of whatever version is newest. Currently, npm@next is 2.0.0-beta.0, which has other bugs, leading to a brew upgrade breaking existing npm-based projects.

This comment has been minimized.

Copy link
@MikeMcQuaid

MikeMcQuaid Aug 27, 2014

Author Member

Please create an issue rather than commenting on the commit.


Pathname.glob(npm_root/"man/*") do |man|
dir = send(man.basename)
man.children.each {|file| dir.install_symlink(file) }
end
end

def npm_prefix
d = "#{HOMEBREW_PREFIX}/share/npm"
if File.directory? d
d
else
HOMEBREW_PREFIX.to_s
if build.with? "completion"
bash_completion.install_symlink \
npm_root/"lib/utils/completion.sh" => "npm"
end
end

def caveats
if build.without? "npm"; <<-end.undent
Homebrew has NOT installed npm. If you later install it, you should supplement
your NODE_PATH with the npm module folder:
#{npm_prefix}/lib/node_modules
end
elsif not ENV['PATH'].split(':').include? "#{npm_prefix}/bin"; <<-end.undent
Probably you should amend your PATH to include npm-installed binaries:
#{npm_prefix}/bin
#{HOMEBREW_PREFIX}/lib/node_modules
end
end
end
Expand All @@ -107,5 +80,7 @@ def caveats
output = `#{bin}/node #{path}`.strip
assert_equal "hello", output
assert_equal 0, $?.exitstatus

system "#{HOMEBREW_PREFIX}/bin/npm", "install", "npm" if build.with? "npm"
end
end

0 comments on commit f900829

Please sign in to comment.