어제 두 번째 강의를 우여곡절 끝에 강의를 마무리하게 되면서 신기하고 오묘한 경험을 나누고자 글을 쓰게 되었다.
VSCode
내부 터미널에서 git
을 설치 했는데 실행이 안되신 분들이라면 제대로 찾아오신 게 맞습니다!!
1시간 대여한 스터디 룸에서 강의 세팅
디스코드 봇 스터디/프로젝트 강의는 프로그램을 처음 배우는, 또는 파이썬에 대한 경험이 적은 분들이 모이다 보니
파이썬 환경 세팅이나, 터미널을 쓰는데 익숙하지 않은 분들이 계신다.
문제가 발생한 부분은 디스코드 봇 서버를 실행시키기 이전에 pip
설치하는 부분에서 일어났다.
정확히는 pip
자체에 대한 문제가 아니라, pip
설치 중에 레포지토리를 직접 포인팅하는 의존성 떄문에
pip
내에 git
이 동작하지 않는 것이었다.
음.. 아니 Github Desktop 안에 git 기능이 있는거 아니였나?
강의 전 반드시 설치하라고 부탁드린 것
우선 소스코드를 공유한다는 목적 이전에, 나중에 프로젝트 규모를 키워서 협업을 하게끔 만드려면
지금은 몰라도, 언젠가는 git
기능을 쓸 줄 알아야 했기 때문에
어차피 CLI
, GUI
차이만 있는 것 외에는 똑같은 Github Desktop
을 반드시 설치해달라고 부탁드렸다.
나는 당연히 Github Desktop
내에 git
기능이 당연히 있을거라고 생각했다.
환경변수에 알아서 추가가 되겠거니, git
설치를 따로 요구하지 않았다.
솔직히 Github Desktop을 설치했는데
콘솔에서 git이 동작하지 않을거라고 직접 해보지 않고 알 수 있는 사람이 얼마나 될까?
…
이런 메세지는 귀하군요...
직접 옆에서 강의를 진행했더라면… ㅠㅠ 하고 답답함이 있기도 했지만,
일단 에러 메세지를 잘 보내주셔가지고 git
이 없다는 문제는 파악 할 수 있었다.
설치 파일 보는 것도 오랜만이군
그래서 일단 내가 직접 설치 파일을 다운 받아서 분명히 에디터 맞춤형이 있겠거니 해서
사진처럼 옵션을 선택하고 설치하라고 부탁드렸다.
그래... git을 치면 이게 나와야지
그리고 시간이 얼마 지나고 나서 git
이 없다는 에러를 겪은 분 중 한 분이 해결하셨다.
설치가 이렇게 해결되는데 뭐지..?
이때 문제가 해결되었다는 말을 듣고, 나는 반신반의 했다.
나는 단지 설치할 때 말한 조건대로 설치하고, VSCode를 껐다 다시 키라고 말하는 것이었기 때문이다.
설치 문제 때문에 거의 한 시간이 지나고, 다른 한 분이 마저 해결하지 못해서 일단 집으로 가서 저녁을 먹고 마저 해결해 드리기로 했다.
스터디 카페에서 집으로 돌아가는 길에 뭐가 잘못 되었는지 계속 고민해봤다.
(Q1) 환경 변수를 직접 건드렸나?
→ (A1) 이번에 파이썬 좀 배우겠다고 하시는 분들인데 환경변수를 건드렸을 일이 있나?
(Q2) VSCode 터미널이 일반 터미널이랑 다른가?, 나만 PS(PowerShell)로 동작하고 그거 대로 환경 설정이 다른가?
→ (A2) 에러 메세지 사진 보내주신 것들을 다시 돌려보니 아니다, 쉘 환경이 다르면 한 번 켜지면 영원히 안 꺼지고 계속 사용하는 쉘인가?
이렇게 나 스스로와의 질의응답, 2번 째 답변에서 아! 아? 강력한 범인의 냄세가 느껴졌다.
VSCode의 터미널이 우리를 시각적으로 속이고 있었다!!
VSCode의 터미널은 윈도우 사용자라면 윈도우 키 + R
(실행) + “cmd”로 커맨드 창을 여는 것에 익숙하실 것이다.
이런식으로 새롭게 열리는 CMD
는 매번 새로운 새션, 즉 호출 당시 환경을 새로 가지고 사용한다.
그래서 파일을 실행하는 도중에 CDM
에서 실행 중인 파일을 수정해도 반영이 안된다(당연히)
예를 들면 python main.py
를 쳐서 파이썬 스크립트를 실행하고, main.py
수정 된 것을 반영하려면 당연히
Ctrl + C
를 연타해 프로세스를 종료시키고 다시 실행시킨다.
이 때 쉘의 환경에서 바뀐 것이라곤 main.py
뿐이다.
문제는 도중에 python
이라는 환경 변수를 3.8에서 3.9 바꾼다면 python3.8
라고 직접 명시하지 않는 이상
최상위 버전이 python
이라는 환경 변수를 항상 덮어 씌우도록 Windows에서 설정했기 때문에
CMD
상에서는 업데이트가 안 된 python
환경 변수를 가르킨다고 볼 수 있다.
즉, 정리하면 쉘은 로드 될 때 참조할 환경 변수를 가져오고, 완전히 새로운 프로세스를 시작하지 않는 이상
이전의 환경 변수를 가지고 실행한다는 것이다.
Medium에서 작성한 글 A Fork() in the road에서 작성한 것이 기억나서
VSCode의 터미널에서도 Git을 설치하기 이전 환경 변수를 아직도 가지고 있는 것이고,
VSCode 프로세스를 완전히 꺼버려서 터미널도 꺼버리면 되겠구나!라는 결론에 도달했다.
그래서 위에 CMD 사진이랑 VSCode가 우리가 무엇을 속이는 지에 대해 이어 쓰자면,
일단 위에 CMD는 한 번 끄고 새로운 CMD를 키면 방향키로 ↑, ↓ 해도 이전에 사용한 명령어를 불러오지 못한다.
하지만 VSCode에서는 다르다!
VSCode가 우리를 속이고 있었다는 증거
사진 1.
현재 내가 지킬 블로그를 작성하면서,
가장 최근에 친 명령어가 bundle exec jekyll serve --livereload
로 실행 중에 라이브로 로깅되는 것을 밑에 볼 수 있다
사진 2.
VSCode를 상단 오른쪽 X를 클릭해 창 닫기를 하면 우리는 당연히
프로세스가 종료 되었다고 생각할 수 밖에 없다.
밑에 아이콘이 사라지고, 화면 밑에 카톡마냥 아이콘이 남는게 아니기 때문이다.
그리고 다시 켰을 때 터미널에서는 마치 새롭게 시작했다는 것 마냥 인사 메세지를 보여준다.
사진 3.
일반 CMD, 커맨드 프롬트에서 새로운 걸 키면 작성한 명령어가 없으니 방향키 ↑, ↓를 해도 아무것도 안나오지만,
VSCode 터미널은 새로운 매세지도 보내고, 이전에 실행했던 명령어를 불러올 수 있다!!!
그래서 VSCode의 터미널은 창이 닫힘과 동시에
터미널 프로세스가 바로 종료되는 것이 아니고, 터미널의 State가 보존이 된다고 표현하는게 맞나?
아무튼 그래서 사용자에게 혼동을 야기한다.
해결 방법
뭔가 이런 과정을 생각하면서 설명을 하자니 숨이 턱 막혀서
원격 데스크톱을 통해 터미널을 닫았다 다시 열어서 실행해보니 정상적으로 돌아갔다…
이것만 하면 되는 건데... 삽질을...
이렇게 명시적으로 존재하는 PowerShell을 종료시켜야지 (새롭게) git이 설치된 환경변수를 가진 PowerShell을 사용할 수 있었던 것이다.
즉, 컴퓨터를 껐다가 키고, VSCode를 껐다가 키고, git을 재설치하고 이 난리를 피우지 않아도 되었던 것이다.
덧, VSCode는 electron으로 만들어졌다
내가 electron.js 프레임워크에 대해서 Node.js 런타임 환경을 브라우저 상으로 가져오는 방식이라 너무 신기해 파고 들었던 적이 있다.
그 기능 중에 사용자가 창닫기 아이콘을 클릭 할 때 before-quit
라는 이벤트가 있다(doc - before-quit).
이건 창을 닫기 전에 뭘 할 수 있는 마지막 기회 같은 건데, 읽고 있는 당신이 스마트 폰 앱 개발자라면 생각하는 그게 맞다.
그래서 아무튼, VSCode를 끄고 재부팅을 하라고 위에 말을 아무리해도,
내가 위에 올린 “VSCode가 우리를 속이고 있었다는 증거” 사진처럼 창을 닫고, 창을 닫고 난 뒤에 컴퓨터를 껐다가 켜도
세션이 남아 있을 수 있던게 아닐까 싶다.
MS는 VSCode를 왜 이렇게 디자인 했을까?
실수로 창을 닫았다가 콘솔창에 찍힌 결과물을 날린 안 좋은 경험 때문에 그랬던 걸까?
야발
이렇게 간단한 문제가, 내가 평소에 터미널 창에서 느낀 이상한 것들 때문이라니
이런건 기록으로 남겨서 한 사람이라도 빨리 이런 고통에 시달리지 않게 해야한다고 생각한다.