build-tools
build-tools copied to clipboard
Cannot find module after installing @electron/build-tools on Arch
internal/modules/cjs/loader.js:895
throw err;
^
Error: Cannot find module '/home/ross/.electron_build_tools/src/e'
Require stack:
- /usr/lib/node_modules/@electron/build-tools/run.js
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:892:15)
at Function.Module._load (internal/modules/cjs/loader.js:742:27)
at Module.require (internal/modules/cjs/loader.js:964:19)
at require (internal/modules/cjs/helpers.js:88:18)
at Object.<anonymous> (/usr/lib/node_modules/@electron/build-tools/run.js:15:1)
at Module._compile (internal/modules/cjs/loader.js:1075:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1096:10)
at Module.load (internal/modules/cjs/loader.js:940:32)
at Function.Module._load (internal/modules/cjs/loader.js:781:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12) {
code: 'MODULE_NOT_FOUND',
requireStack: [ '/usr/lib/node_modules/@electron/build-tools/run.js' ]
}
I just ran npm install -g @electron/build-tools
on Arch LInux and got this error after rehashing in zsh and running e init --root=~/electron --bootstrap testing
.
A solution I came up with:
git clone https://github.com/electron/build-tools ~/.electron_build_tools && (cd ~/.electron_build_tools && npm install)
I think the package should at least come with a bundled version of the build tools or install them.
@RossComputerGuy Can you post the output of npm config ls --global
. My guess is you have somehow disabled post-install scripts which is how the build-tools
npm package sets up and bootstraps the tools
; cli configs
global = true
metrics-registry = "https://registry.npmjs.org/"
scope = ""
user-agent = "npm/6.14.4 node/v14.9.0 linux x64"
If you run npm i -g @electron/build-tools
does it log any errors to console or otherwise indicate it is running a post-install script? You can run npm
with --verbose
to get silly logs.
npm info it worked if it ends with ok
npm verb cli [
npm verb cli '/usr/bin/node',
npm verb cli '/home/ross/emberliteOS/buildroot/output/host/bin/npm',
npm verb cli 'install',
npm verb cli '-g',
npm verb cli '@electron/build-tools',
npm verb cli '--verbose'
npm verb cli ]
npm info using [email protected]
npm info using [email protected]
npm verb npm-session 6064ec1da2dc4b5f
npm http fetch GET 200 https://registry.npmjs.org/@electron%2fbuild-tools 15ms (from cache)
npm timing stage:loadCurrentTree Completed in 35ms
npm timing stage:loadIdealTree:cloneCurrentTree Completed in 0ms
npm timing stage:loadIdealTree:loadShrinkwrap Completed in 1ms
npm timing stage:loadIdealTree:loadAllDepsIntoIdealTree Completed in 2ms
npm timing stage:loadIdealTree Completed in 4ms
npm timing stage:generateActionsToTake Completed in 2ms
npm verb correctMkdir /home/ross/emberliteOS/buildroot/output/build/.npm-cache/_locks correctMkdir not in flight; initializing
npm verb lock using /home/ross/emberliteOS/buildroot/output/build/.npm-cache/_locks/staging-f417518c18993d1c.lock for /home/ross/emberliteOS/buildroot/output/target/usr/lib/node_modules/.staging
npm timing action:extract Completed in 18ms
npm timing action:finalize Completed in 2ms
npm timing action:refresh-package-json Completed in 7ms
npm info lifecycle @electron/[email protected]~preinstall: @electron/[email protected]
> @electron/[email protected] preinstall /home/ross/emberliteOS/buildroot/output/target/usr/lib/node_modules/@electron/build-tools
> node preinstall.js
Already on 'master'
Your branch is up to date with 'origin/master'.
HEAD is now at a791356 fix: allow empty config in goma.ensure
yarn install v1.22.5
warning package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in order to avoid resolution inconsistencies caused by unsynchronized lock files. To clear this warning, remove package-lock.json.
[1/5] Validating package.json...
[2/5] Resolving packages...
success Already up-to-date.
Done in 0.27s.
npm verb lifecycle @electron/[email protected]~preinstall: unsafe-perm in lifecycle true
npm verb lifecycle @electron/[email protected]~preinstall: PATH: /home/ross/emberliteOS/buildroot/output/host/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp-bin:/home/ross/emberliteOS/buildroot/output/target/usr/lib/node_modules/@electron/build-tools/node_modules/.bin:/home/ross/emberliteOS/buildroot/output/target/usr/lib/node_modules/.bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/opt/android-sdk/emulator:/opt/android-sdk/platform-tools:/opt/android-sdk/tools:/opt/android-sdk/tools/bin:/usr/lib/emscripten:/var/lib/flatpak/exports/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/home/ross/mycroft-core/bin:/opt/android-sdk/emulator:/opt/android-sdk/platform-tools:/opt/android-sdk/tools:/opt/android-sdk/tools/bin:/usr/lib/emscripten:/var/lib/flatpak/exports/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
npm verb lifecycle @electron/[email protected]~preinstall: CWD: /home/ross/emberliteOS/buildroot/output/target/usr/lib/node_modules/@electron/build-tools
npm timing action:preinstall Completed in 696ms
npm info linkStuff @electron/[email protected]
npm verb linkBins [
npm verb linkBins { e: 'run.js' },
npm verb linkBins '/home/ross/emberliteOS/buildroot/output/target/usr/bin',
npm verb linkBins true
npm verb linkBins ]
/home/ross/emberliteOS/buildroot/output/target/usr/bin/e -> /home/ross/emberliteOS/buildroot/output/target/usr/lib/node_modules/@electron/build-tools/run.js
npm timing action:build Completed in 4ms
npm info lifecycle @electron/[email protected]~install: @electron/[email protected]
npm timing action:install Completed in 0ms
npm info lifecycle @electron/[email protected]~postinstall: @electron/[email protected]
npm timing action:postinstall Completed in 1ms
npm verb unlock done using /home/ross/emberliteOS/buildroot/output/build/.npm-cache/_locks/staging-f417518c18993d1c.lock for /home/ross/emberliteOS/buildroot/output/target/usr/lib/node_modules/.staging
npm timing stage:executeActions Completed in 734ms
npm timing stage:rollbackFailedOptional Completed in 0ms
npm timing stage:runTopLevelLifecycles Completed in 777ms
+ @electron/[email protected]
added 1 package from 1 contributor in 0.779s
npm verb exit [ 0, true ]
npm timing npm Completed in 968ms
npm info ok
Oh right, you've manually fixed this already. Can you rm -r ~/.electron_build_tools
and the run the same command again π
npm info it worked if it ends with ok
npm verb cli [
npm verb cli '/usr/bin/node',
npm verb cli '/home/ross/emberliteOS/buildroot/output/host/bin/npm',
npm verb cli 'install',
npm verb cli '-g',
npm verb cli '@electron/build-tools',
npm verb cli '--verbose'
npm verb cli ]
npm info using [email protected]
npm info using [email protected]
npm verb npm-session 062f310d73df3fa9
npm http fetch GET 304 https://registry.npmjs.org/@electron%2fbuild-tools 299ms (from cache)
npm timing stage:loadCurrentTree Completed in 325ms
npm timing stage:loadIdealTree:cloneCurrentTree Completed in 0ms
npm timing stage:loadIdealTree:loadShrinkwrap Completed in 1ms
npm timing stage:loadIdealTree:loadAllDepsIntoIdealTree Completed in 3ms
npm timing stage:loadIdealTree Completed in 5ms
npm timing stage:generateActionsToTake Completed in 2ms
npm verb correctMkdir /home/ross/emberliteOS/buildroot/output/build/.npm-cache/_locks correctMkdir not in flight; initializing
npm verb lock using /home/ross/emberliteOS/buildroot/output/build/.npm-cache/_locks/staging-f417518c18993d1c.lock for /home/ross/emberliteOS/buildroot/output/target/usr/lib/node_modules/.staging
npm timing action:extract Completed in 15ms
npm timing action:finalize Completed in 3ms
npm timing action:refresh-package-json Completed in 9ms
npm info lifecycle @electron/[email protected]~preinstall: @electron/[email protected]
> @electron/[email protected] preinstall /home/ross/emberliteOS/buildroot/output/target/usr/lib/node_modules/@electron/build-tools
> node preinstall.js
yarn install v1.22.5
[1/5] Validating package.json...
[2/5] Resolving packages...
[3/5] Fetching packages...
info [email protected]: The platform "linux" is incompatible with this module.
info "[email protected]" is an optional dependency and failed compatibility check. Excluding it from installation.
[4/5] Linking dependencies...
[5/5] Building fresh packages...
Done in 3.25s.
npm verb lifecycle @electron/[email protected]~preinstall: unsafe-perm in lifecycle true
npm verb lifecycle @electron/[email protected]~preinstall: PATH: /home/ross/emberliteOS/buildroot/output/host/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp-bin:/home/ross/emberliteOS/buildroot/output/target/usr/lib/node_modules
/@electron/build-tools/node_modules/.bin:/home/ross/emberliteOS/buildroot/output/target/usr/lib/node_modules/.bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/opt/android-sdk/emulator:/opt/android-sdk/platform-tools:/opt/android-sdk/tools:/op
t/android-sdk/tools/bin:/usr/lib/emscripten:/var/lib/flatpak/exports/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl:/home/ross/mycroft-core/bin:/opt/android-sdk/emulator:/opt/android-sdk/platform-t
ools:/opt/android-sdk/tools:/opt/android-sdk/tools/bin:/usr/lib/emscripten:/var/lib/flatpak/exports/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
npm verb lifecycle @electron/[email protected]~preinstall: CWD: /home/ross/emberliteOS/buildroot/output/target/usr/lib/node_modules/@electron/build-tools
npm timing action:preinstall Completed in 4037ms
npm info linkStuff @electron/[email protected]
npm verb linkBins [
npm verb linkBins { e: 'run.js' },
npm verb linkBins '/home/ross/emberliteOS/buildroot/output/target/usr/bin',
npm verb linkBins true
npm verb linkBins ]
/home/ross/emberliteOS/buildroot/output/target/usr/bin/e -> /home/ross/emberliteOS/buildroot/output/target/usr/lib/node_modules/@electron/build-tools/run.js
npm timing action:build Completed in 4ms
npm info lifecycle @electron/[email protected]~install: @electron/[email protected]
npm timing action:install Completed in 1ms
npm info lifecycle @electron/[email protected]~postinstall: @electron/[email protected]
npm timing action:postinstall Completed in 1ms
npm verb unlock done using /home/ross/emberliteOS/buildroot/output/build/.npm-cache/_locks/staging-f417518c18993d1c.lock for /home/ross/emberliteOS/buildroot/output/target/usr/lib/node_modules/.staging
npm timing stage:executeActions Completed in 4076ms
npm timing stage:rollbackFailedOptional Completed in 0ms
npm timing stage:runTopLevelLifecycles Completed in 4409ms
+ @electron/[email protected]
added 1 package from 1 contributor in 4.411s
npm verb exit [ 0, true ]
npm timing npm Completed in 4673ms
npm info ok
Interesting, that looks like it worked. Can you try e --help
to verify π€
Seems to work
I'll test again outside the environment I had set up for cross compiling electron
Without sudo, as my user:
~
β npm install -g @electron/build-tools
npm WARN checkPermissions Missing write access to /usr/lib/node_modules/@electron/build-tools
npm WARN checkPermissions Missing write access to /usr/lib/node_modules/@electron
npm ERR! code EACCES
npm ERR! syscall access
npm ERR! path /usr/lib/node_modules/@electron/build-tools
npm ERR! errno -13
npm ERR! Error: EACCES: permission denied, access '/usr/lib/node_modules/@electron/build-tools'
npm ERR! [Error: EACCES: permission denied, access '/usr/lib/node_modules/@electron/build-tools'] {
npm ERR! errno: -13,
npm ERR! code: 'EACCES',
npm ERR! syscall: 'access',
npm ERR! path: '/usr/lib/node_modules/@electron/build-tools'
npm ERR! }
npm ERR!
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you do not have the permissions to access this file as the current user
npm ERR!
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator.
npm ERR! A complete log of this run can be found in:
npm ERR! /home/ross/.npm/_logs/2020-09-03T07_02_45_039Z-debug.log
With sudo:
~
β sudo npm install -g @electron/build-tools
> @electron/[email protected] preinstall /usr/lib/node_modules/@electron/build-tools
> node preinstall.js
fatal: could not create work tree dir '/root/.electron_build_tools': Permission denied
Failed to install build-tools: Error: Command "git clone" failed with exit code 128
at throwForBadSpawn (/usr/lib/node_modules/@electron/build-tools/preinstall.js:10:11)
at install (/usr/lib/node_modules/@electron/build-tools/preinstall.js:37:7)
at Object.<anonymous> (/usr/lib/node_modules/@electron/build-tools/preinstall.js:61:1)
at Module._compile (internal/modules/cjs/loader.js:1075:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1096:10)
at Module.load (internal/modules/cjs/loader.js:940:32)
at Function.Module._load (internal/modules/cjs/loader.js:781:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
at internal/main/run_main_module.js:17:47
/usr/bin/e -> /usr/lib/node_modules/@electron/build-tools/run.js
+ @electron/[email protected]
added 1 package from 1 contributor in 0.645s
OS: Arch Linux NPM Version: 6.14.7 Node Version: 14.9.0
On a fresh install, just after installing VS, git, node, and python I get this.
Error: Cannot find module 'C:\Users\jacob\.electron_build_tools\src\e'
Require stack:
- C:\Users\jacob\AppData\Roaming\npm\node_modules\@electron\build-tools\run.js
β[90m at Function.Module._resolveFilename (node:internal/modules/cjs/loader:924:15)β[39m
β[90m at Function.Module._load (node:internal/modules/cjs/loader:769:27)β[39m
β[90m at Module.require (node:internal/modules/cjs/loader:996:19)β[39m
β[90m at require (node:internal/modules/cjs/helpers:92:18)β[39m
at Object.<anonymous> (C:\Users\jacob\AppData\Roaming\npm\node_modules\β[4m@electronβ[24m\build-tools\run.js:15:1)
β[90m at Module._compile (node:internal/modules/cjs/loader:1092:14)β[39m
β[90m at Object.Module._extensions..js (node:internal/modules/cjs/loader:1121:10)β[39m
β[90m at Module.load (node:internal/modules/cjs/loader:972:32)β[39m
β[90m at Function.Module._load (node:internal/modules/cjs/loader:813:14)β[39m
β[90m at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:76:12)β[39m {
code: β[32m'MODULE_NOT_FOUND'β[39m,
requireStack: [
β[32m'C:\\Users\\jacob\\AppData\\Roaming\\npm\\node_modules\\@electron\\build-tools\\run.js'β[39m
]
}
from npm i -g @electron/build-tools
C:\Users\jacob>npm i --verbose @electron/build-tools
npm verb cli [
npm verb cli 'C:\\Program Files\\nodejs\\node.exe',
npm verb cli 'C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js',
npm verb cli 'i',
npm verb cli '--verbose',
npm verb cli '@electron/build-tools'
npm verb cli ]
npm info using [email protected]
npm info using [email protected]
npm timing config:load:defaults Completed in 1ms
npm timing config:load:file:C:\Program Files\nodejs\node_modules\npm\npmrc Completed in 3ms
npm timing config:load:builtin Completed in 3ms
npm timing config:load:cli Completed in 1ms
npm timing config:load:env Completed in 0ms
npm timing config:load:project Completed in 1ms
npm timing config:load:file:C:\Users\jacob\.npmrc Completed in 0ms
npm timing config:load:user Completed in 0ms
npm timing config:load:file:C:\Users\jacob\AppData\Roaming\npm\etc\npmrc Completed in 0ms
npm timing config:load:global Completed in 0ms
npm timing config:load:cafile Completed in 0ms
npm timing config:load:validate Completed in 0ms
npm timing config:load:setUserAgent Completed in 1ms
npm timing config:load:setEnvs Completed in 0ms
npm timing config:load Completed in 7ms
npm verb npm-session a184bee01421ea8d
npm timing npm:load Completed in 382ms
npm timing arborist:ctor Completed in 0ms
npm timing idealTree:init Completed in 9ms
npm timing idealTree:userRequests Completed in 2ms
npm timing arborist:ctor Completed in 0ms
npm http fetch GET 304 https://registry.npmjs.org/@electron%2fbuild-tools 191ms (from cache)
npm timing idealTree:#root Completed in 200ms
npm timing idealTree:node_modules/@electron/build-tools Completed in 0ms
npm timing idealTree:buildDeps Completed in 231ms
npm timing idealTree:fixDepFlags Completed in 0ms
npm timing idealTree Completed in 316ms
npm timing reify:loadTrees Completed in 350ms
npm timing reify:diffTrees Completed in 2ms
npm timing reify:retireShallow Completed in 0ms
npm timing reify:createSparse Completed in 34ms
npm timing reify:loadBundles Completed in 0ms
npm timing reifyNode:node_modules/@electron/build-tools Completed in 45ms
npm timing reify:unpack Completed in 46ms
npm timing reify:unretire Completed in 0ms
npm timing build:queue Completed in 1ms
npm info run @electron/[email protected] preinstall node_modules/@electron/build-tools node preinstall.js
npm http fetch POST 200 https://registry.npmjs.org/-/npm/v1/security/advisories/bulk 162ms
npm timing auditReport:getReport Completed in 167ms
npm timing auditReport:init Completed in 0ms
npm timing reify:audit Completed in 223ms
npm info run @electron/[email protected] preinstall { code: 0, signal: null }
npm timing build:run:preinstall:node_modules/@electron/build-tools Completed in 1966ms
npm timing build:run:preinstall Completed in 1967ms
npm timing build:link:node_modules/@electron/build-tools Completed in 5ms
npm timing build:link Completed in 6ms
npm timing build:deps Completed in 2003ms
npm timing build Completed in 2003ms
npm timing reify:build Completed in 2004ms
npm timing reify:trash Completed in 0ms
npm timing reify:save Completed in 13ms
npm timing reify Completed in 2617ms
added 1 package, and audited 2 packages in 3s
found 0 vulnerabilities
npm timing command:install Completed in 2670ms
npm verb exit 0
npm timing npm Completed in 3374ms
npm info ok
I seem to be having the same issue on a clean install of Ubuntu 18.04.5 and 20.04. Able to install @electron/build-tools without any issue but attempting to run 'e' fails with Error: Cannot find module '/home/vm/.electron_build_tools/src/e'
vm@vm:~$ npm config ls --global ; cli configs global = true metrics-registry = "https://registry.npmjs.org/" scope = "" user-agent = "npm/6.14.11 node/v14.16.0 linux x64"
; userconfig /home/vm/.npmrc prefix = "/home/vm/.npm-global"
; node bin location = /usr/bin/node ; cwd = /home/vm ; HOME = /home/vm ; "npm config ls -l" to show all defaults.
Any update on this? I'm also into this issue.
Got this issue too.Turns out that I did not add Git to PATH.Better to have some log about this...
I also have this issue. I've tried npm i -g, but when I try to run e, it looks in my home directory instead of in /usr/lib:
[levi@arch-vm build-tools]$ e init --help
node:internal/modules/cjs/loader:936
throw err;
^
Error: Cannot find module '/home/levi/.electron_build_tools/src/e'
Require stack:
- /usr/lib/node_modules/@electron/build-tools/run.js
at Function.Module._resolveFilename (node:internal/modules/cjs/loader:933:15)
at Function.Module._load (node:internal/modules/cjs/loader:778:27)
at Module.require (node:internal/modules/cjs/loader:999:19)
at require (node:internal/modules/cjs/helpers:102:18)
at Object.<anonymous> (/usr/lib/node_modules/@electron/build-tools/run.js:15:1)
at Module._compile (node:internal/modules/cjs/loader:1097:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1149:10)
at Module.load (node:internal/modules/cjs/loader:975:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) {
code: 'MODULE_NOT_FOUND',
requireStack: [ '/usr/lib/node_modules/@electron/build-tools/run.js' ]
}
Node.js v17.3.0
Installing a copy in my user's home directory seems to have resolved the issue.
This happens in windows as well
C:\workspace\watched>e internal/modules/cjs/loader.js:905 throw err; ^
Error: Cannot find module 'C:\Users\Vivek.electron_build_tools\src\e' Require stack:
- C:\Users\Vivek\AppData\Roaming\npm\node_modules@electron\build-tools\run.js
[90m at Function.Module._resolveFilename (internal/modules/cjs/loader.js:902:15)[39m
[90m at Function.Module._load (internal/modules/cjs/loader.js:746:27)[39m
[90m at Module.require (internal/modules/cjs/loader.js:974:19)[39m
[90m at require (internal/modules/cjs/helpers.js:92:18)[39m
at Object.
(C:\Users\Vivek\AppData\Roaming\npm\node_modules\[4m@electron[24m\build-tools\run.js:15:1) [90m at Module._compile (internal/modules/cjs/loader.js:1085:14)[39m [90m at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)[39m [90m at Module.load (internal/modules/cjs/loader.js:950:32)[39m [90m at Function.Module._load (internal/modules/cjs/loader.js:790:14)[39m [90m at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)[39m { code: [32m'MODULE_NOT_FOUND'[39m, requireStack: [ [32m'C:\Users\Vivek\AppData\Roaming\npm\node_modules\@electron\build-tools\run.js'[39m ] }
I also suffered this issue. And I found out that
- uninstalling build-tools from npm
- install yarn
- install build-tools again
resolved my issue. If other people confirms that it is resolved by installing yarn, I suggests to modify README.md to state yarn to be 'must install' rather than 'recommend installing'.
I also suffered this issue. And I found out that
1. uninstalling build-tools from npm 2. install yarn 3. install build-tools again
resolved my issue. If other people confirms that it is resolved by installing yarn, I suggests to modify README.md to state yarn to be 'must install' rather than 'recommend installing'.
This worked for me. Just did a brew install yarn
and ran the install again. Works now!
I also suffered this issue. And I found out that
1. uninstalling build-tools from npm 2. install yarn 3. install build-tools again
resolved my issue. If other people confirms that it is resolved by installing yarn, I suggests to modify README.md to state yarn to be 'must install' rather than 'recommend installing'.
didn't worked for me, (I am on Ubuntu 22.04)
I also suffered this issue. And I found out that
1. uninstalling build-tools from npm 2. install yarn 3. install build-tools again
resolved my issue. If other people confirms that it is resolved by installing yarn, I suggests to modify README.md to state yarn to be 'must install' rather than 'recommend installing'.
didn't worked for me, (I am on Ubuntu 22.04)
Found how to install so here's a little tutorial:
run sudo npm i -g @electron/build-tools
create directory at ~/.electron_build_tools (mkdir ~/.electron_build_tools
)
and go to it in your terminal (cd ~/.electron_build_tools
)
do git clone https://github.com/electron/build-tools/
and copy the content of the folder created (build-tools) to .electron_build_tools. and Voila here's your electron build tool !