성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] 정적 분석과 함께, 이제는 실행 시 성능 분석까지 (비록 Azu...
[정성태] .NET Source Browser를 이용해 Roslyn 소스 ...
[정성태] Experimental C# Interceptors: AOT &...
[정성태] .NET Conf 2023 (Day 2) - Tiny, fast...
[정성태] The end of the Tye Experiment #1622...
[정성태] This is a simple app that converts ...
[정성태] Wrathmark: An Interesting Compute W...
[정성태] FFmpeg Filters Every Youtuber Needs...
[정성태] 일단, PInvokeStackImbalance 오류가 발생했다는...
[Heegyoo Lee] 코드 자체는 동작하는 것처럼 보이는데요. (어떤 때는 시그니쳐가...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>electronize - User Profile 디렉터리에 공백 문자가 있는 경우 빌드가 실패하는 문제</h1> <p> 예를 들어, 윈도우의 사용자 이름이 "Default User"라고 가정해보겠습니다. 이런 경우라면 %USERPROFILE%이나 %LOCALAPPDATA%, %APPDATA% 등의 경로에 공백이 포함됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\temp> <span style='color: blue; font-weight: bold'>echo %USERPROFILE%</span> C:\Users\Default User C:\temp> <span style='color: blue; font-weight: bold'>echo %LOCALAPPDATA%</span> C:\Users\Default User\AppData\Local C:\temp> <span style='color: blue; font-weight: bold'>echo %APPDATA%</span> C:\Users\Default User\AppData\Roaming </pre> <br /> 이 상태에서 electronize로 빌드 시,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > electronize build /target win-x64 /PublishReadyToRun false </pre> <br /> 다음과 같은 식의 오류가 발생하는데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Error: EEXIST: file already exists, mkdir 'C:\Users\Default' TypeError: Cannot read property 'loaded' of undefined at exit (C:\Program Files\nodejs\node_modules\npm\lib\utils\error-handler.js:98:27) at errorHandler (C:\Program Files\nodejs\node_modules\npm\lib\utils\error-handler.js:216:3) at C:\Program Files\nodejs\node_modules\npm\bin\npm-cli.js:77:20 at cb (C:\Program Files\nodejs\node_modules\npm\lib\npm.js:225:22) at C:\Program Files\nodejs\node_modules\npm\lib\npm.js:263:24 at C:\Program Files\nodejs\node_modules\npm\lib\config\core.js:83:7 at Array.forEach (<anonymous>) at C:\Program Files\nodejs\node_modules\npm\lib\config\core.js:82:13 at f (C:\Program Files\nodejs\node_modules\npm\node_modules\once\once.js:25:25) at afterExtras (C:\Program Files\nodejs\node_modules\npm\lib\config\core.js:173:20) C:\Program Files\nodejs\node_modules\npm\lib\utils\error-handler.js:98 var doExit = npm.config.loaded ? npm.config.get('_exit') : true ^ TypeError: Cannot read property 'loaded' of undefined at exit (C:\Program Files\nodejs\node_modules\npm\lib\utils\error-handler.js:98:27) at process.errorHandler (C:\Program Files\nodejs\node_modules\npm\lib\utils\error-handler.js:216:3) at process.emit (events.js:198:13) at process._fatalException (internal/bootstrap/node.js:496:27) Install for electron-builder@latest failed with code 7 F:\cloud_drive\Dropbox\articles\elec_net\kestrel_razor_sample\ConsoleApp1\obj\desktop\win-x64> ... done </pre> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > npm ERR! code ENOLOCAL npm ERR! Could not install from "User\AppData\Roaming\npm-cache\_npx\16672" as it does not contain a package.json file. npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\Default User\AppData\Roaming\npm-cache\_logs\2021-01-27T05_21_25_321Z-debug.log Install for electron-builder@latest failed with code 1 </pre> <br /> 출력에 나온 log 파일을 보면 node.exe에 전달된 경로가 이렇게 해석된 것을 확인할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 0 info it worked if it ends with ok 1 verbose cli [ 'C:\\Program Files\\nodejs\\node.exe', 1 verbose cli 'C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js', 1 verbose cli 'install', 1 verbose cli 'electron-builder@latest', 1 verbose cli '--global', 1 verbose cli '--prefix', <span style='color: blue; font-weight: bold'>1 verbose cli 'C:\\Users\\Default', 1 verbose cli 'User</span>\\AppData\\Roaming\\npm-cache\\_npx\\16672', 1 verbose cli '--loglevel', 1 verbose cli 'error', 1 verbose cli '--json' ] ...[생략]... </pre> <br /> 원인을 유추해 보면, 저 경로는 "%APPDATA%" 경로에 포함된 공백이 명령행 인자에서 2개로 나눠져 인식이 되었기 때문입니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 이에 대한 근본적인 원인을 해결하려면 저렇게 실행하는 코드를 수정해야 합니다. 가령 node.exe를 실행할 때 전달하는 %APPDATA%에 대한 경로를 다음과 같은 식으로 인용 부호로 묶어 전달해야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp> node.exe "C:\Users\Default User\AppData\Roaming\npm-cache\_npx\16672" ...[생략]... </pre> <br /> 따라서 이러한 버그를 수정해 달라는 이슈를 생성하거나, 아니면 직접 소스 코드를 고쳐 빌드하는 수 밖에는 없습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 한 가지 다행이라면, 이렇게 경로에 '공백 문자'가 있는 경우 8.3 형식의 경로를 사용해 표현하는 것이 가능하다는 점입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Windows - 도스 시절의 8.3 경로를 알아내는 방법 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12511'>https://www.sysnet.pe.kr/2/0/12511</a> </pre> <br /> 가령, 이런 경우 electronize는 내부에서 "C:\Users\Default User\AppData\Roaming\npm-cache\_npx\21340"라는 경로를 아마도 다음과 같은 식으로 구했을 것입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > string path = GetEnvrionmentVairable("APPDATA"); // C:\Users\Default User\AppData\Roaming string arg1 = path + "\npm-cache\_npx\16672"; </pre> <br /> 따라서 환경 변수로 설정된 LOCALAPPDATA나, APPDATA에 대해 같은 경로로 대우받는 8.3 형식으로 명시하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > SET LOCALAPPDATA=C:\Users\<span style='color: blue; font-weight: bold'>DEFAULT~1</span>\AppData\Local SET APPDATA=C:\Users\<span style='color: blue; font-weight: bold'>DEFAULT~1</span>\AppData\Roaming </pre> <br /> 이때 사용자 계정으로 등록된 "Default User"의 8.3 이름은 다음과 같은 명령어로 간단하게 구할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\temp> <span style='color: blue; font-weight: bold'>dir /X "%USERPROFILE%\.."</span> Volume in drive C has no label. Volume Serial Number is C02C-196F Directory of C:\Users 2021-01-27 오후 02:33 <DIR> . 2021-01-27 오후 02:33 <DIR> .. 2020-12-24 오후 08:17 <DIR> <span style='color: blue; font-weight: bold'>DEFAUL~1</span> <span style='color: blue; font-weight: bold'>Default User</span> 2021-01-22 오후 07:42 <DIR> MSSQLS~1 MSSQLSERVER 2020-12-03 오전 11:02 <DIR> RDVGRA~1 RDV GRAPHICS SERVICE 2021-01-22 오후 07:42 <DIR> SQLTEL~1 SQLTELEMETRY 0 File(s) 0 bytes 6 Dir(s) 50,487,128,064 bytes free </pre> <br /> 명령행에서 이렇게 설정하고 다시 문제가 되었던 빌드 명령을 수행하면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp> SET LOCALAPPDATA=C:\Users\DEFAULT~1\AppData\Local c:\temp> SET APPDATA=C:\Users\DEFAULT~1\AppData\Roaming c:\temp> electronize build /target win-x64 /PublishReadyToRun false </pre> <br /> 정상적으로 실행이 되는 것을 확인할 수 있습니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1711
(왼쪽의 숫자를 입력해야 합니다.)