在 Windows 10 上构建 npm bcrypt 包时出错

Error building npm bcrypt package on Windows 10

我正在尝试在最近从 Windows 7 升级到 Windows 10 的机器上向 运行 申请 node.js;但是,npm install 命令在尝试构建 bcrypt 扩展时失败:

>npm install

> bcrypt@0.8.2 install C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\bcrypt
> node-gyp rebuild


>if not defined npm_config_node_gyp (node "C:\Program Files\nodejs\node_modules\npm\bin\node-gyp-bin\..\..\node_modules\node-gyp\bin\node-gyp.js" rebuild )  else (node  rebuild )
Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch.
  blowfish.cc
  bcrypt.cc
  bcrypt_node.cc
..\src\bcrypt.cc(232): warning C4267: '=': conversion from 'size_t' to 'unsigned char', possible loss of data [C:\Users\ken\Documents\Projects\node.j
s\node-app\node_modules\bcrypt\build\bcrypt_lib.vcxproj]
c:\users\ken\documents\projects\node.js\node-app\node_modules\nan\nan_implementation_12_inl.h(181): error C2660: 'v8::Signature::New': function does not take 4 arguments (compiling source file ..\src\bcrypt_node.cc) [C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\bcrypt\build\bcrypt_lib.vcxproj]
C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\nan\nan.h(173): error C2995: 'v8::Local<T> _NanEnsureLocal(v8::Local<T>)': function
 template has already been defined (compiling source file ..\src\bcrypt_node.cc) [C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\bcrypt\build\bcrypt_lib.vcxproj]
  C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\nan\nan.h(166): note: see declaration of '_NanEnsureLocal' (compiling source file
   ..\src\bcrypt_node.cc)
C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\nan\nan.h(564): error C3083: 'smalloc': the symbol to the left of a '::' must be a type (compiling source file ..\src\bcrypt_node.cc) [C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\bcrypt\build\bcrypt_lib.vcxproj
]
C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\nan\nan.h(564): error C2039: 'FreeCallback': is not a member of 'node' (compiling source file ..\src\bcrypt_node.cc) [C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\bcrypt\build\bcrypt_lib.vcxproj]
  C:\Users\ken\.node-gyp.4.1\include\node\node_object_wrap.h(8): note: see declaration of 'node' (compiling source file ..\src\bcrypt_node.cc)
C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\nan\nan.h(564): error C2061: syntax error: identifier 'FreeCallback' (compiling source file ..\src\bcrypt_node.cc) [C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\bcrypt\build\bcrypt_lib.vcxproj]
C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\nan\nan.h(568): error C2065: 'callback': undeclared identifier (compiling source file ..\src\bcrypt_node.cc) [C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\bcrypt\build\bcrypt_lib.vcxproj]
C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\nan\nan.h(568): error C2065: 'hint': undeclared identifier (compiling source file ..\src\bcrypt_node.cc) [C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\bcrypt\build\bcrypt_lib.vcxproj]
C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\nan\nan.h(575): error C2665: 'node::Buffer::New': none of the 4 overloads could convert all the argument types (compiling source file ..\src\bcrypt_node.cc) [C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\bcrypt\build\bcrypt_lib.vcxproj]
  C:\Users\ken\.node-gyp.4.1\include\node\node_buffer.h(43): note: could be 'v8::MaybeLocal<v8::Object> node::Buffer::New(v8::Isolate *,char *,size
  _t)' (compiling source file ..\src\bcrypt_node.cc)
  C:\Users\ken\.node-gyp.4.1\include\node\node_buffer.h(31): note: or       'v8::MaybeLocal<v8::Object> node::Buffer::New(v8::Isolate *,v8::Local<v
  8::String>,node::encoding)' (compiling source file ..\src\bcrypt_node.cc)
  C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\nan\nan.h(575): note: while trying to match the argument list '(v8::Isolate *, const char *, uint32_t)' (compiling source file ..\src\bcrypt_node.cc)
C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\nan\nan.h(579): error C2440: 'return': cannot convert from 'v8::MaybeLocal<v8::Object>' to 'v8::Local<v8::Object>' (compiling source file ..\src\bcrypt_node.cc) [C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\bcrypt\build\bcrypt_lib.vcxproj]
  C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\nan\nan.h(579): note: No constructor could take the source type, or constructor overload resolution was ambiguous (compiling source file ..\src\bcrypt_node.cc)
C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\nan\nan.h(586): error C2039: 'Use': is not a member of 'node::Buffer' (compiling source file ..\src\bcrypt_node.cc) [C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\bcrypt\build\bcrypt_lib.vcxproj]
  C:\Users\ken\.node-gyp.4.1\include\node\node_buffer.h(8): note: see declaration of 'node::Buffer' (compiling source file ..\src\bcrypt_node.cc)
C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\nan\nan.h(586): error C3861: 'Use': identifier not found (compiling source file ..\src\bcrypt_node.cc) [C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\bcrypt\build\bcrypt_lib.vcxproj]
..\src\bcrypt_node.cc(76): warning C4244: 'argument': conversion from 'ssize_t' to 'unsigned char', possible loss of data [C:\Users\ken\Documents\Pro
jects\node.js\node-app\node_modules\bcrypt\build\bcrypt_lib.vcxproj]
..\src\bcrypt_node.cc(85): warning C4996: 'node::Encode': was declared deprecated [C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\
bcrypt\build\bcrypt_lib.vcxproj]
  C:\Users\ken\.node-gyp.4.1\include\node\node.h(298): note: see declaration of 'node::Encode'
..\src\bcrypt_node.cc(137): warning C4244: 'argument': conversion from 'const ssize_t' to 'unsigned char', possible loss of data [C:\Users\ken\Docume
nts\Projects\node.js\node-app\node_modules\bcrypt\build\bcrypt_lib.vcxproj]
..\src\bcrypt_node.cc(139): warning C4996: 'node::Encode': was declared deprecated [C:\Users\ken\Documents\Projects\node.js\node-app\node_modules
\bcrypt\build\bcrypt_lib.vcxproj]
  C:\Users\ken\.node-gyp.4.1\include\node\node.h(298): note: see declaration of 'node::Encode'
..\src\bcrypt_node.cc(172): warning C4996: 'node::Encode': was declared deprecated [C:\Users\ken\Documents\Projects\node.js\node-app\node_modules
\bcrypt\build\bcrypt_lib.vcxproj]
  C:\Users\ken\.node-gyp.4.1\include\node\node.h(298): note: see declaration of 'node::Encode'
..\src\bcrypt_node.cc(223): warning C4996: 'node::Encode': was declared deprecated [C:\Users\ken\Documents\Projects\node.js\node-app\node_modules
\bcrypt\build\bcrypt_lib.vcxproj]
  C:\Users\ken\.node-gyp.4.1\include\node\node.h(298): note: see declaration of 'node::Encode'
..\src\bcrypt_node.cc(231): warning C4267: 'initializing': conversion from 'size_t' to 'int', possible loss of data [C:\Users\ken\Documents\Projects\
node.js\node-app\node_modules\bcrypt\build\bcrypt_lib.vcxproj]
..\src\bcrypt_node.cc(232): warning C4267: 'initializing': conversion from 'size_t' to 'int', possible loss of data [C:\Users\ken\Documents\Projects\
node.js\node-app\node_modules\bcrypt\build\bcrypt_lib.vcxproj]
gyp ERR! build error
gyp ERR! stack Error: `C:\Program Files (x86)\MSBuild.0\bin\msbuild.exe` failed with exit code: 1
gyp ERR! stack     at ChildProcess.onExit (C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\lib\build.js:270:23)
gyp ERR! stack     at emitTwo (events.js:87:13)
gyp ERR! stack     at ChildProcess.emit (events.js:172:7)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:200:12)
gyp ERR! System Windows_NT 10.0.10586
gyp ERR! command "C:\Program Files\nodejs\node.exe" "C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\bin\node-gyp.js" "rebuild"
gyp ERR! cwd C:\Users\ken\Documents\Projects\node.js\node-app\node_modules\bcrypt
gyp ERR! node -v v5.4.1
gyp ERR! node-gyp -v v3.0.3
gyp ERR! not ok
npm ERR! Windows_NT 10.0.10586
npm ERR! argv "C:\Program Files\nodejs\node.exe" "C:\Program Files\nodejs\node_modules\npm\bin\npm-cli.js" "install"
npm ERR! node v5.4.1
npm ERR! npm  v3.3.12
npm ERR! code ELIFECYCLE

npm ERR! bcrypt@0.8.2 install: `node-gyp rebuild`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the bcrypt@0.8.2 install script 'node-gyp rebuild'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the bcrypt package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node-gyp rebuild
npm ERR! You can get their info via:
npm ERR!     npm owner ls bcrypt
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     C:\Users\ken\Documents\Projects\node.js\node-app\npm-debug.log

nan 错误让我怀疑 bcrypt 扩展可能使用了旧版本的 nan 包,但如果我手动安装 nan,错误仍然存​​在。

bcrypt 包使用 node-gyp 作为其原生构建基础设施;这有一个 list of requirements 我有(VS 2015 Community Edition 除外;我有 VS 2015 Professional)。为了查看我是否可以从源代码构建 bcrypt 包,我克隆了 bcrypt 存储库和 运行 它的 Makefile

>mingw32-make
node-gyp clean
gyp info it worked if it ends with ok
gyp info using node-gyp@3.2.1
gyp info using node@5.4.1 | win32 | x64
gyp info ok
node-gyp configure
gyp info it worked if it ends with ok
gyp info using node-gyp@3.2.1
gyp info using node@5.4.1 | win32 | x64
gyp info spawn F:\python2\python.EXE
gyp info spawn args [ 'C:\Users\ken\AppData\Roaming\npm\node_modules\node-gyp\gyp\gyp_main.py',
gyp info spawn args   'binding.gyp',
gyp info spawn args   '-f',
gyp info spawn args   'msvs',
gyp info spawn args   '-G',
gyp info spawn args   'msvs_version=auto',
gyp info spawn args   '-I',
gyp info spawn args   'C:\Users\ken\Documents\Projects\node.js\node.bcrypt.js\build\config.gypi',
gyp info spawn args   '-I',
gyp info spawn args   'C:\Users\ken\AppData\Roaming\npm\node_modules\node-gyp\addon.gypi',
gyp info spawn args   '-I',
gyp info spawn args   'C:\Users\ken\.node-gyp\5.4.1\include\node\common.gypi',
gyp info spawn args   '-Dlibrary=shared_library',
gyp info spawn args   '-Dvisibility=default',
gyp info spawn args   '-Dnode_root_dir=C:\Users\ken\.node-gyp\5.4.1',
gyp info spawn args   '-Dnode_gyp_dir=C:\Users\ken\AppData\Roaming\npm\node_modules\node-gyp',
gyp info spawn args   '-Dnode_lib_file=node.lib',
gyp info spawn args   '-Dmodule_root_dir=C:\Users\ken\Documents\Projects\node.js\node.bcrypt.js',
gyp info spawn args   '--depth=.',
gyp info spawn args   '--no-parallel',
gyp info spawn args   '--generator-output',
gyp info spawn args   'C:\Users\ken\Documents\Projects\node.js\node.bcrypt.js\build',
gyp info spawn args   '-Goutput_dir=.' ]
gyp info ok
node-gyp build
gyp info it worked if it ends with ok
gyp info using node-gyp@3.2.1
gyp info using node@5.4.1 | win32 | x64
gyp info spawn C:\Program Files (x86)\MSBuild.0\bin\msbuild.exe
gyp info spawn args [ 'build/binding.sln',
gyp info spawn args   '/clp:Verbosity=minimal',
gyp info spawn args   '/nologo',
gyp info spawn args   '/p:Configuration=Release;Platform=x64' ]
Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch.
  blowfish.cc
  bcrypt.cc
  bcrypt_node.cc
..\src\bcrypt.cc(232): warning C4267: '=': conversion from 'size_t' to 'unsigned char', possible loss of data [C:\Users\ken\Documents\Projects\node.j
s\node.bcrypt.js\build\bcrypt_lib.vcxproj]
..\src\bcrypt_node.cc(76): warning C4244: 'argument': conversion from 'ssize_t' to 'unsigned char', possible loss of data [C:\Users\ken\Documents\Pro
jects\node.js\node.bcrypt.js\build\bcrypt_lib.vcxproj]
..\src\bcrypt_node.cc(229): warning C4267: 'initializing': conversion from 'size_t' to 'int', possible loss of data [C:\Users\ken\Documents\Projects\
node.js\node.bcrypt.js\build\bcrypt_lib.vcxproj]
..\src\bcrypt_node.cc(230): warning C4267: 'initializing': conversion from 'size_t' to 'int', possible loss of data [C:\Users\ken\Documents\Projects\
node.js\node.bcrypt.js\build\bcrypt_lib.vcxproj]
  win_delay_load_hook.c
kernel32.lib : fatal error LNK1183: invalid or corrupt file: extended relocation count 2848 less than 65535 [C:\Users\ken\Documents\Projects\node.js\
node.bcrypt.js\build\bcrypt_lib.vcxproj]
gyp ERR! build error
gyp ERR! stack Error: `C:\Program Files (x86)\MSBuild.0\bin\msbuild.exe` failed with exit code: 1
gyp ERR! stack     at ChildProcess.onExit (C:\Users\ken\AppData\Roaming\npm\node_modules\node-gyp\lib\build.js:276:23)
gyp ERR! stack     at emitTwo (events.js:87:13)
gyp ERR! stack     at ChildProcess.emit (events.js:172:7)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (internal/child_process.js:200:12)
gyp ERR! System Windows_NT 10.0.10586
gyp ERR! command "C:\Program Files\nodejs\node.exe" "C:\Users\ken\AppData\Roaming\npm\node_modules\node-gyp\bin\node-gyp.js" "build"
gyp ERR! cwd C:\Users\ken\Documents\Projects\node.js\node.bcrypt.js
gyp ERR! node -v v5.4.1
gyp ERR! node-gyp -v v3.2.1
gyp ERR! not ok
Makefile:11: recipe for target 'compile' failed
mingw32-make: *** [compile] Error 1

有一些类似于 npm 构建的转换警告,但不同的是致命错误,这次是在链接器中:kernel32.lib : fatal error LNK1183: invalid or corrupt file: extended relocation count 2848 less than 65535 [C:\Users\ken\Documents\Projects\node.js\node.bcrypt.js\build\bcrypt_lib.vcxproj]

无论如何,很明显 bcrypt Makefile 仅用于 bootstrap 构建,而繁重的世界正在由 msbuild 完成。我提取了 msbuild 命令行并对其进行了修改以生成更详细的日志记录:

> "C:\Program Files (x86)\MSBuild.0\bin\msbuild.exe" build/binding.sln /fl /clp:Verbosity=detailed /nologo /p:Configuration=Release;Platform=x64

当我这样做时,我注意到 LIB 环境变量被传递给 link 子进程时有些问题:

Task "SetEnv"
  LIB=C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\amd64;C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\lib\amd64;C:\Program Files (x86)\Windows Kits\lib.0.10240.0\ucrt\x64;;;C:\Program Files (x86)\Windows Kits.1\lib\winv6.3\um\x64;;C:\Program Files (x86)\Windows Kits\NETFXSDK.6\Lib\um\x64
Done executing task "SetEnv".

如果您检查这些路径,您会注意到它使用的是来自 Windows 10 SDK (C:\Program Files (x86)\Windows Kits\lib.0.10240.0\ucrt\x64) 和 Windows 8.1 SDK (C:\Program Files (x86)\Windows Kits.1\lib\winv6.3\um\x64) 的目录.这似乎破坏了构建;如果我手动 运行 链接器并将路径设置为 Windows 10 SDK,它会构建。但是,我无法说服构建过程自行执行此操作!我曾尝试通过重命名其注册表项来隐藏 8.1 SDK,但没有成功。我也一直在尝试找出在 msbuild 基础设施中设置这些库路径的确切位置,同样没有成功。

我自己的直觉是升级到 Windows 10 不知何故搞砸了 msbuild,我应该减少损失并尝试 运行 清理构建虚拟机。有人有其他建议吗?

我有同样的问题,但刚刚再次尝试安装 bcrypt 一切正常。 请尝试使用版本 0.8.6 希望有帮助。

这是一种替代解决方案,但您可以改为安装 bcryptjs。

npm install bcryptjs

这与 bcrypt 的工作原理相同,安装后您可以进入 node_modules 并将 bcryptjs 包名称更改为 bcrypt。之后应该可以工作。