ข้อขัดแย้ง node.js: / sbin / node vs / usr / bin / node


32

ฉันมี Ubuntu 12.10 สองเครื่อง: machine A เป็น VMWare VM และ machine B เป็นแล็ปท็อป Acer รุ่นเก่า ในทั้งสองเครื่องฉันติดตั้งโหนดโดยใช้ apt-get แต่เครื่องจะติดตั้งไบนารีหลัก/usr/bin/nodeและเครื่อง B /usr/bin/nodejsรวม นี่คือพฤติกรรมบางอย่างที่ฉันสังเกตเห็น:

  1. ทั้งสองเครื่องกลับมา/usr/bin/nodeตอบสนองต่อwhich nodeคำสั่ง อย่างไรก็ตามไม่มีไฟล์ดังกล่าวในเครื่อง B
  2. การออกคำสั่งnodeใช้ได้กับเครื่อง A ไม่ใช่ B สำหรับ B ฉันต้องใช้nodejsแทน
  3. บน B มีไบนารีที่เรียกว่า / sbin / node A ไม่ได้

พฤติกรรมเหล่านี้ทำให้เกิดปัญหาความไม่สอดคล้องกันเมื่อพัฒนาบนเครื่องทั้งสอง ตอนนี้ฉันทำงานโดยเปลี่ยนชื่อไบนารีใน B เช่น:

sudo mv /sbin/node /sbin/node-sbin
sudo ln -s /usr/bin/nodejs /usr/bin/node

จะมีวิธีการแก้ไขปัญหานี้จริงๆดังนั้นโหนดที่จะได้รับการติดตั้งเป็น/usr/bin/nodeแทน/usr/bin/nodejs?

คำตอบ:


15

บน Ubuntu 13.10 คำตอบทั้งหมดข้างต้นไม่ได้ผลสำหรับฉัน ในที่สุดมันก็ทำงานได้เมื่อฉันติดตั้ง nodejs-legacy

sudo apt-get install nodejs-legacy

สิ่งนี้จัดเตรียมไว้อย่างถูกต้อง/usr/bin/nodeสำหรับฉันเพื่อให้nodemonสามารถใช้งานได้


มีความคิดใดบ้างว่าทำไมเราต้องติดตั้งสิ่งนี้? มันสร้าง symlink ด้วยวิธีใด? เหตุใดโหนดจึงเปลี่ยนชื่อของไฟล์เรียกใช้งานของมันเป็น nodejs
Augustin Riedinger

ชื่อ "โหนด" ขัดแย้งกับโปรแกรมรุ่นเก่ากว่ามาก ดูlists.debian.org/debian-devel-announce/2012/07/msg00002.htmlและคำตอบของ Leftium ด้านล่าง
Robie Basak

36

อัปเดต:คำแนะนำที่แก้ไขด้านล่างเพื่อใช้nodejs-legacyแพคเกจ ( ข้อมูลเพิ่มเติมเกี่ยวกับโหนดแบบดั้งเดิม )

ลองลบแพ็กเกจโหนดที่ขัดแย้งกันโดยสมบูรณ์:

sudo apt-get --purge remove node
sudo apt-get --purge remove nodejs-legacy
sudo apt-get --purge remove nodejs

sudo apt-get install nodejs-legacy

# Confirm it worked
node --version       # v0.10.13
ls -la `which node`  # ... /usr/bin/node -> /etc/alternatives/node

สิ่งนี้เกิดขึ้นกับฉันเมื่อฉันติดตั้งnodeแพ็กเกจnon-node.js โดยไม่รู้ตัว แม้ว่าฉันapt-get remove nodeจะทำก่อนที่จะติดตั้งnodejsแพ็คเกจที่ถูกต้องแต่ฉันคิดว่า--purgeจำเป็นต้องมีข้อโต้แย้ง

ข้อมูลความเป็นมา :

มีความขัดแย้งในการตั้งชื่อกับแพ็กเกจโหนด (Amateur Packet Radio Node Program) และโหนด nodejs ถูกเปลี่ยนชื่อจากโหนดเป็น nodejs คุณจะต้อง symlink / usr / bin / node ไปยัง / usr / bin / nodejs หรือคุณสามารถถอนการติดตั้งโปรแกรมโหนดวิทยุสมัครเล่นแพ็คเก็ตเพื่อหลีกเลี่ยงความขัดแย้งนั้น


ขอบคุณสำหรับข้อมูลพื้นหลัง ณ จุดนี้ฉันไม่มีเครื่องจักรใด ๆ ที่จะลองใช้ แต่ฉันหวังว่าฉันจะได้กลับมาเยี่ยมชมอีกซักวันหนึ่ง
Hai Vu

สิ่งนี้ไม่ได้รับ/usr/bin/nodeใน Ubuntu 13.10 แต่คำตอบของ @ user229115 ด้านล่างใช้งานได้
จิมสจ๊วต

1
ดังนั้นด้วย Ubuntu 13.10 sudo apt-get install nodejs nodejs-legacyจะให้nodeไบนารีเป็น node.js แต่ถ้าคุณติดตั้งแล้วnode(Amateur Packet Radio Node Program) คุณจะต้องลบออกอย่างชัดเจน
jonasfj

1
@AugustinRiedinger: ฉันได้รับคำตอบของฉันแล้ว ฉันคิดว่าการรวมกันของทั้งสองการกวาดล้างแพ็คเกจ 'กำหนดค่าผิดพลาด' และการติดตั้งnodejs-legacyแพคเกจจะทำงาน
Leftium

1
ขอบคุณมันชัดเจนมาก อันที่จริงมันทำงานได้เมื่อติดตั้งnodejs-lecacyแพคเกจซึ่งอาจเป็นเพียง symlink เพื่อnodejsปฏิบัติการจริง ...
Augustin Riedinger

11

น่าเสียดายสำหรับฉันการสร้าง symlink ไม่ทำงาน สิ่งที่ใช้ได้ผลสำหรับฉันคือการสร้างนามแฝง ใน~/.bashrcหรือ~/.bash_aliases(ถ้า~/.bashrcโหลดไฟล์นี้) เพียงแค่เพิ่มบรรทัดต่อไปนี้:

alias node="nodejs"

รีสตาร์ทเซสชัน bash ของคุณโดยพิมพ์bashลงในคอนโซลและนามแฝงของคุณจะทำงาน


2
เมื่อฉันสร้าง symlink จะไม่ทำงานจนกว่าฉันจะเริ่มต้นเทอร์มินัลอื่น ลองรีสตาร์ทเครื่องของคุณ ... หรือคำตอบของฉันที่ใช้งานได้โดยไม่มี
symlink

@Leftium: คุณจำเป็นต้องเรียกใช้: source ~/.bashrcเพื่อโหลดไฟล์. bashrc อีกครั้ง (หากคุณไม่ต้องการรีสตาร์ทเครื่อง) อ่านเพิ่มเติม ..
Deepak Joy

การเชื่อมโยงที่ตำแหน่งใหม่เกือบจะต้องมีการhash nodeร้องขอในเทอร์มินัลที่มีอยู่ของคุณเนื่องจากเชลล์สมัยใหม่จำตำแหน่งของคำสั่งที่เคยค้นหาใน PATH ได้ hashคำสั่ง builtin ในเปลือกหอยดังกล่าวบอกว่าพวกเขาจะทำซ้ำการค้นหาและจำตำแหน่งใหม่
mtraceur

7

ฉันคิดว่านี่คือ:

sudo ปรับปรุงทางเลือก - ติดตั้ง / usr / bin / โหนดโหนด / usr / bin / nodejs 10

ใช้ทางเลือก Debian


ขอบคุณ นี่เป็นวิธีที่ตรงที่สุดในการแก้ไขการตัดสินใจของ Ubuntu ในเรื่องนี้
ดึง

@drew ดูเหมือนว่าอูบุนตูตามการตัดสินใจของ Debian เกี่ยวกับเรื่องนี้อยู่บนพื้นฐานของข้อผิดพลาดอูบุนตูbugs.launchpad.net/ubuntu/+source/node/+bug/1030421
Lloyd Dewolf

1

ตอบช้า แต่สำหรับข้อมูลล่าสุด ...

หากคุณติดตั้ง node.js โดยใช้วิธีการแนะนำจากreadme การติดตั้งโหนด githubมันแนะนำให้ทำตามคำแนะนำในบทความบล็อก nodesourceแทนที่จะติดตั้งจาก repo apt-get repo ล้าสมัย node.js ควรรันโดยใช้nodeคำสั่ง เช่นเดียวกับnodejsคำสั่งโดยไม่ต้องสร้าง symlink ใหม่

วิธีการจากบทความนี้คือ:

# Note the new setup script name for Node.js v0.12
curl -sL https://deb.nodesource.com/setup_0.12 | sudo bash -

# Then install with:
sudo apt-get install -y nodejs

โปรดทราบว่านี่สำหรับ v0.12 ซึ่งจะกลายเป็นล้าสมัยในอนาคตไม่ไกล

นอกจากนี้หากคุณอยู่หลังพร็อกซีขององค์กร (เช่นฉัน) คุณจะต้องเพิ่มตัวเลือก -E ในคำสั่ง sudo เพื่อรักษา env vars ที่จำเป็นสำหรับพร็อกซี:

curl -sL https://deb.nodesource.com/setup_0.12 | sudo -E bash -

1

บนUbuntu 14.04ฉันมีปัญหาโหนดเดียวกัน ฉันไม่ทำงาน "node" และทำงาน "nodejs" ฉันแค่ทำ

sudo apt-get remove node

และหลังจากนั้นโหนดก็ทำงานอยู่และ nodejs ก็กำลังทำงานอยู่เช่นกัน :) ฉันใหม่กับ linux และนั่นก็เป็นข้อผิดพลาดสำหรับฉัน อย่างไรก็ตาม Bower กำลังทำงาน !!!


0
sudo getconf LONG_BIT
sudo uname -p
  • ยืนยันสถาปัตยกรรมซีพียูของคุณ
  • ค้นหาการแจกจ่าย node.js ของคุณในแผนผังไดเร็กทอรีที่https://nodejs.org/dist/ (หมายเหตุ: การแจกแจง node.js รุ่นต่างๆสำหรับซีพียูสถาปัตยกรรมต่างๆ)

เดสก์ท็อปของฉันคือ Ubuntu 15.10 AMD64 ดังนั้นฉันจะใช้ URL ต่อไปนี้ในตัวอย่างการติดตั้งของฉัน (อีกครั้งความแตกต่างของ distrib):

sudo wget https://nodejs.org/dist/v5.0.0/node-v5.0.0-linux-x64.tar.gz

จากนั้นเปลี่ยนไดเรกทอรีเป็นไดเรกทอรีดาวน์โหลดของคุณ :

sudo cd /home/name/Downloads

จากไดเรกทอรีดาวน์โหลดของคุณดำเนินการดังต่อไปนี้:

sudo tar -C /usr/local --strip-components 1 -xzf node-v5.0.0-linux-x64.tar.gz

ยืนยันการติดตั้ง node.js ของคุณด้วยสิ่งต่อไปนี้:

sudo ls -l /usr/local/bin/node
sudo ls -l /usr/local/bin/npm

อ้าง http://www.hostingadvice.com/how-to/install-nodejs-ubuntu-14-04/


1
-1 เฉพาะความต้องการของคำสั่งtar sudo
muru

+1 ขอบคุณมากสำหรับวิธีที่ดีกว่า - วิธีที่ดีที่สุดสำหรับฉัน!
1111161171159459134
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.