You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
同理,通过阅读 os.homdir() 统一读取 HOME 环境变量,只需要保证 lerna bootstrap 与 npm run postinstall 一致即可。
// lib/os.jsmodule.exports={homedir: getHomeDirectory,}// src/node_os.ccstaticvoidGetHomeDirectory(constFunctionCallbackInfo<Value>&args){Environment*env=Environment::GetCurrent(args);charbuf[PATH_MAX];size_tlen=sizeof(buf);constinterr=uv_os_homedir(buf,&len);if(err){CHECK_GE(args.Length(),1);env->CollectUVExceptionInfo(args[args.Length()-1],err,"uv_os_homedir");returnargs.GetReturnValue().SetUndefined();}Local<String>home=String::NewFromUtf8(env->isolate(),buf,v8::NewStringType::kNormal,len).ToLocalChecked();args.GetReturnValue().Set(home);}// deps/uv/src/unix/core.cintuv_os_homedir(char*buffer,size_t*size){uv_passwd_tpwd;size_tlen;intr;/* Check if the HOME environment variable is set first. The task of performing input validation on buffer and size is taken care of by uv_os_getenv(). */r=uv_os_getenv("HOME",buffer,size);if(r!=UV_ENOENT)returnr;/* HOME is not set, so call uv__getpwuid_r() */r=uv__getpwuid_r(&pwd);if(r!=0){returnr;}len=strlen(pwd.homedir);if(len>=*size){*size=len+1;uv_os_free_passwd(&pwd);returnUV_ENOBUFS;}memcpy(buffer,pwd.homedir,len+1);*size=len;uv_os_free_passwd(&pwd);return0;}intuv_os_getenv(constchar*name,char*buffer,size_t*size){char*var;size_tlen;if(name==NULL||buffer==NULL||size==NULL||*size==0)returnUV_EINVAL;var=getenv(name);if(var==NULL)returnUV_ENOENT;len=strlen(var);if(len>=*size){*size=len+1;returnUV_ENOBUFS;}memcpy(buffer,var,len+1);*size=len;return0;}
问题
在 lerna bootstrap 运行 postintall 任务脚本中,调用 os.tmpdir() 函数输出结果值会默认指向当前npm包项目目录,和通过 npm run postinstall 运行脚本任务返回正确的系统临时目录 /tmp 存在差异。
解决方法
通过使用 os.homedir() 替代 os.tmpdir() ,在二者运行时环境中返回值相同,来保证一致性。
根本原因
通过阅读源码,可以看到,以 Linux 环境为例, os.tmpdir() 会按顺序读取环境变量
TMPDIR
|TMP
|TEMP
,否则默认返回为/tmp
。lerna bootstrap
会初始化环境变量TMPDIR
为当前安装包项目根目录,导致 `os.tmpdir() 与 默认的 npm install postinstall 运行时不一致。同理,通过阅读 os.homdir() 统一读取 HOME 环境变量,只需要保证 lerna bootstrap 与 npm run postinstall 一致即可。
测试用例
通过以下测试用例
os.test.js
,为了验证 os.tmpdir() os.homedir() 是否可以通过修改环境变量值,来获取不同的返回值。输出结果如下:
推荐阅读
The text was updated successfully, but these errors were encountered: