node.js 를 처음 깔아보려고 했다.
nodejs.org 에 ( https://nodejs.org/en/download/ ) 가보니 윈도우에서 커맨드로 설치하는 방법이 간단하게 나와 있어서 따라해 보려했다.
명령은 다음 네개였으나, 2개만 성공하고 나머지는 나오지 않았다.
- winget install Schniz.fnm
- fnm install 22
- node -v
- npm -v
node -v, npm -v 는 설치된 node 프로그램과 npm 프로그램의 버전을 확인해 보는 명령인데, 1, 2 번을 문제없이 수행했는데도 명령을 찾지 못하고 실패했다. 아마도 실행파일 이 설치되고 패쓰변수에 설치경로가 추가되지 않아서 그런 것 같아서, 재부팅을 했는데도 계속 node -v, npm -v 가 실패했다.
재부팅 후에 fnm 이라는 명령어는 성공하여, fnm -h 같은 명령은 수행이 가능했다. 하지만 여전히 node -v, npm -v 는 실행되지 않았다.
nodejs 를 깔려고 하는 것인데, fnm 은 무엇인지 1, 2번 명령의 정체가 무엇인지 궁금했다. 그에 대해 조사하여 알아낸 것을 정리한다.
1번 winget install Schniz.fnm 이라는 명령어는 fnm 을 윈도우에 설치하는 것이다. fnm 은 fast node manager 로, nodejs 환경을 여러 버전을 설치하고 관리할 수 있도록 해주는 툴이다. nvm 이라는 node version manager 라는 툴이 유명했는데, 이것보다 빠르다고 한다. 어쨌든 winget install schniz.fnm 명령으로 fnm 은 시스템에 깔렸고, 명령창에서 명령도 먹는 상태가 된다.
2번 fnm install 22 는 nodejs 22 버전을 설치하라는 명령어이다. fnm install 19 라고 하면 nodejs 19 버전이 깔릴 것이다. fnm use 22 라고 하면 설치되어 있는 nodejs 22 버전의 node.exe 가 실행되도록 설정하게 될 것이다. 그런데, fnm use 명령을 실행하면 we can't find necessary environment... 에러가 발생했다. 뭐지?
이 에러는 https://github.com/Schniz/fnm?tab=readme-ov-file#powershell 부분의 설정을 해주지 않아서 발생한 것이었다. fnm 을 사용하기 위해서는 명령셸 초기화 스크립트에 fnm 관련된 설정 내용이 추가되어야 한다. bash 에서 사용하려면, bash 가 시작할 때마다 실행되는 .bashrc 에 초기 설정명령들을 넣어 주어야 할 것이고, 윈도우에서는 powershell 의 초기 스크립트에 환경설정 등의 스크립트 명령이 들어가야 한다. 링크에 있는 내용을 따라서 해주면 큰 문제없다.
내 시스템의 경우는, 아직 powershell 프로파일 파일이 없어서 readme 의 가이드에 따라 파일을 만들고, 아래 내용을 마지막에 추가해 주었다.
fnm env --use-on-cd --shell powershell | Out-String | Invoke-Expression
파일을 저장하고 powershell 을 다시 실행 (관리자 권한으로 실행할 필요 없음) 하니 node -v, npm -v 명령이 모두 성공하였다.
저 한 줄이 무엇을 바꾼 것인가 하면, node.exe, npm 명령이 들어있는 경로를 PATH 변수에 추가하고, 다른 fnm 관련 환경변수들을 추가하는 등의 shell 명령을 추가한 것이다. 추가한 내용은 powershell 에서 fnm env --use-on-cd --shell powershell 만 실행해보면 주르륵 내용이 나오는데, 내 시스템에서의 결과는 다음과 같다.
$env:PATH = "C:\Users\me\AppData\Local\fnm_multishells\17080_1744149833933;C:\Users\me\AppData\Local\fnm_multishells\19120_1744149603435;C:\Program Files\Eclipse Adoptium\jdk-17.0.9.9-hotspot\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;C:\Program Files\Git\cmd;C:\Program Files\Bandizip\;C:\Program Files\CMake\bin;C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit\;C:\Users\me\AppData\Local\Programs\Python\Python39\Scripts\;C:\Users\me\AppData\Local\Programs\Python\Python39\;C:\Users\me\.local\bin;C:\Users\me\.cargo\bin;C:\Users\me\AppData\Local\Microsoft\WindowsApps;;C:\Users\me\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\me\AppData\Local\Microsoft\WindowsApps;C:\Users\me\AppData\Local\Programs\Swift\Runtimes\6.0.2\usr\bin\;C:\Users\me\AppData\Local\Programs\Swift\Toolchains\6.0.2+Asserts\usr\bin\;C:\Users\me\AppData\Local\Programs\Swift\Tools\6.0.2\;C:\Users\me\AppData\Local\Microsoft\WinGet\Links;"
$env:FNM_MULTISHELL_PATH = "C:\Users\me\AppData\Local\fnm_multishells\17080_1744149833933"
$env:FNM_VERSION_FILE_STRATEGY = "local"
$env:FNM_DIR = "C:\Users\me\AppData\Roaming\fnm"
$env:FNM_LOGLEVEL = "info"
$env:FNM_NODE_DIST_MIRROR = "https://nodejs.org/dist"
$env:FNM_COREPACK_ENABLED = "false"
$env:FNM_RESOLVE_ENGINES = "true"
$env:FNM_ARCH = "x64"
function global:Set-FnmOnLoad { If ((Test-Path .nvmrc) -Or (Test-Path .node-version) -Or (Test-Path package.json)) { & fnm use --silent-if-unchanged }
}
function global:Set-LocationWithFnm { param($path); if ($path -eq $null) {Set-Location} else {Set-Location $path}; Set-FnmOnLoad }
Set-Alias -Scope global cd_with_fnm Set-LocationWithFnm
Set-Alias -Option AllScope -Scope global cd Set-LocationWithFnm
Set-FnmOnLoad
첫줄의 PATH = 어쩌고 부분에 들어있는 첫번째 경로가 node.exe, npm.ps1 이 들어있는 경로이다. 저 경로로 가보면 이렇게 생겼다.
'프로그래밍 > 미분류' 카테고리의 다른 글
OutputDebugString 은 Exception 을 발생시켜서 동작한다 (0) | 2024.05.22 |
---|---|
PE Header (0) | 2024.01.27 |
[RUST] rusqlite, LNK1181: cannot open input file 'sqlite3.lib' (0) | 2024.01.03 |
First chance exception 0X406D1388 (0) | 2023.12.22 |
Flutter Warning: Operand of null-aware operation '!' hastype 'SchedulerBinding' which excludes null. (0) | 2022.08.06 |