본문 바로가기

Server/Node.js

<Node> M1 Mac에서 Rosetta로 노드 패키지 설치하기

* 배경

 - 최근 Cypress라는 프론트엔드에서의 E2E테스트 툴을 공부하면서 발생한 문제와 그 해결과정을 공유하려 한다. 사실 Cypress 공식 문서에 해결방법이 나와있긴 하지만 왜? 라는 의문이 생길 수 있고, 다른 패키지를 설치할 경우에도 충분히 발생할 수 있는 문제이다.

 

 - 필자는 MacBook M1 Air (맥북 M1 에어) 모델을 사용하고있으나 지금까지 OS 관련 문제를 겪어본 적은 없었다. 프론트엔드의 경우 M1과 관련된 특별한 호환 이슈는 들어본 적이 없기도 했고, 비교적 최근에 (2021) 맥북을 구매해서일 수도 있다.

 

 - 하지만 Cypress를 설치하고 실행했더니 다음과 같은 Cypress failed to start 에러가 발생하였다.

 

 

 - Platform이라는 텍스트를 봤을 때, m1이 문제일 수도 있겠다고 느꼈고, 공식문서를 봤더니 rosetta를 이용하여 해결하라는 안내가 있었다.

* Rosetta?

 - m1 칩 이전까지 Mac OS는 Intel 프로세서를 탑재하였다. 그래서 대부분의 앱이 Intel 기반에서 동작하도록 되어 있다.

 

 - 하지만 M1 에서 Apple Silicon이 탑재되기 시작하였고, 초기 M1에서는 호환 이슈가 종종 있었다. 파인더에서 앱의 정보를 보면 아래와 같이 확인할 수 있다.

 - Univesal은 Apple Silicon과 Intel 모두 호환됨을 의미하며 Intel 기반에서만 동작하는 앱은 Intel로 표기되어 있다.

 

 - M1에서 인텔 기반 앱을 사용하려면 위 명령어로 Rosetta를 설치해야 한다. 

 

softwareupdate --install-rosetta --agree-to-license

 

 -Rosetta는 일반적으로 자동으로 백그라운드에서 동작하며, 호환되지 않는 앱들을 실행가능하도록 도와준다.

 

* npm

 - 그래서 Cypress와 Rosetta가 무슨 상관이냐라고 한다면, 문제가 생긴 부분이 arm 기반의 npm으로 cypress를 설치하여 돌렸기 때문이다. 애초에 M1은 터미널이 arm위에서 돌아가고 그 위에 npm을 설치하였기 때문에 노드에서 동작하는 모든 패키지는 거기에 알맞게 설치될 것이고, arm을 지원하지 않는 cypress는 문제가 발생한 것이다.

 

 - 문제를 해결하기 전에, npm 버전관리를 쉽게하기 위해 nvm이 설치되어 있어야 한다. brew를 통해 설치할 수 있으며 이 과정은 쉽게 찾을 수 있으므로 생략하겠다.

 

 - nvm이 설치되면 nvm ls 명령어로 현재 사용중인 노드 버전을 확인할 수 있다.

 

 - node -p 'process.arch' 명령어를 사용하면 현재 노드가 어느 프로세서의 버전으로 돌아가는지 확인할 수 있다.

 

 - 위 사진에서 볼 수 있듯이 필자는 현재 arm기반의 아키텍처(Apple에서 사용하는 아키텍처)로 돌아가고 있음을 알 수있다.

 

 - 하지만 Cypress는 x86_64(인텔에서 사용하는 아키텍처)만 지원한다고 되어 있다. (2022.06기준)

 

* Rosetta with npm

 - Cypress를 intel기반의 npm에서 설치하기 위해 먼저 사용하는 터미널을 아래와 같이 복제하자.

 - 복제한 터미널의 이름을 Rosetta를 사용한다는 것을 알 수 있도록 변경한 후, 정보가져오기를 눌러 아래와 같이 "Rosetta를 사용하여 열기"를 활성화 한다.

 - 이제 이 터미널을 사용하여 설치하기만 하면 될까. 그렇지는 않다. 위에서 언급했듯 node가 이미 arm기반으로 설치되어 있다. 따라서 우리는 이 터미널로 새로운 node을 먼저 설치해야한다.

 

 - nvm ls-remote 명령어로 설치 가능한 노드 버전을 확인하자. 필자는 확인 후 nvm install v14로 14버전 중 최신을 설치하였다.

 

 - 이제 nvm use v14 로 rosetta를 사용한 터미널에서 설치한 노드를 사용하도록 변경후 아키텍처를 확인해보자.

 

 - 놀랍게도 인텔 기반의 아키텍처가 표시된다. 이 상태에서 cypress를 다시 설치하여 실행하면 동작하게 된다.

 

 - 이렇게 node를 설치한 후 부터는 다시 원래 버전으로 돌아가더라도 설치된 cypress가 변하는 것은 아니므로 정상동작하게 된다. 게다가 실행한 터미널과 무관하게 필요에 따라 nvm으로 노드 버전만 바꿔주기만 해도 Node의 process.arch가 변하게 된다.

 

 


참고

 

 

Installing Cypress | Cypress Documentation

What you'll learn How to install Cypress via npm How to install Cypress via direct download How to version and run Cypress via package.json First, make

docs.cypress.io

 

 

'Server > Node.js' 카테고리의 다른 글

<노드JS> http 서버 만들기  (0) 2021.07.17
<노드JS> 노드 내장 모듈  (0) 2021.07.16
<노드JS> 노드 내장 객체  (0) 2021.07.16
<노드JS> 노드 JS란  (0) 2021.07.15