[Bug] SyntaxError when running a "bin" file that isn't authored in JS
See original GitHub issue- I’d be willing to implement a fix
Describe the bug
Yarn 2.0 fails with a SyntaxError
when running a bin
file that isn’t authored in JS. For example, the bin file may be an executable file with a shebang #!/usr/bin/env sh
.
Example bin
file:
#!/usr/bin/env sh
echo 'Hello world!'
To Reproduce
See sample package (@cameronhunter/berry-bin-bug
) that defines a bin
that is an executable file with a shebang.
const { promises: { writeFile, chmod } } = require('fs');
await writeFile('./hello-world', '#!/usr/bin/env sh\necho "Hello world!"');
await chmod('./hello-world', 0o765);
await packageJsonAndInstall({
bin: { 'hello-world': './hello-world' }
});
await expect(yarn('hello-world')).resolves.toContain('Hello world!');
Example of failure:
$ yarn berry-bin-bug
/Users/chunter/workspace/github/cameronhunter/berry-bin-bug/bin/berry-bin-bug:3
echo "Hello world!"
^^^^^^^^^^^^^^
SyntaxError: Unexpected string
at Module._compile (internal/modules/cjs/loader.js:895:18)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10)
at Module.load (internal/modules/cjs/loader.js:815:32)
at Function.module_1.Module._load (/Users/chunter/workspace/github/cameronhunter/berry-bin-bug/.pnp.js:13519:14)
at Function.Module.runMain (internal/modules/cjs/loader.js:1047:10)
at internal/main/run_main_module.js:17:11
Environment if relevant (please complete the following information):
- OS: MacOS Mojave (
10.14.5
) - Node version:
12.14.0
- Yarn version:
2.0.0-rc.28
Issue Analytics
- State:
- Created 4 years ago
- Reactions:30
- Comments:20 (3 by maintainers)
Top Results From Across the Web
Why am I getting a syntax error or server not defined error ...
In your first attempt: node server.js is a command you are expected to run on your shell (bash, Windows Power Shell, etc).
Read more >Handling common JavaScript problems - MDN Web Docs
Now we'll look at common cross-browser JavaScript problems and how to fix them. This includes information on using browser dev tools to track ......
Read more >Common errors | npm Docs
You are trying to install on a drive that either has no space, or has no permission to write. Free some disk space...
Read more >Troubleshooting common AWS CDK issues
When deploying my AWS CDK stack, I receive a NoSuchBucket error ... If you are using TypeScript or JavaScript, your project directory already...
Read more >Troubleshooting Node.js Deploys - Heroku Dev Center
js deploy failed - now what? Start with these simple steps to troubleshoot a build issue. Check the buildpack. Is the app using...
Read more >Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start FreeTop Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
Top GitHub Comments
Thanks for your response, @arcanis. Cross-platform isn’t a goal for many of our (internal) tools so it’s a shame that we have to spin up node to execute a shebang executable. I can certainly work around this using your suggestion though.
Perhaps this ticket could be changed to focus on improving the error message so that other users don’t fall into the same confusion.
Side-question: Is cross-platform portability a goal of berry or is it more the implementation detail of not being able to run them from zip archives?
Some NPM packages (e.g., https://www.npmjs.com/package/elm) are meant to provide a native binary executable for various platforms and expose it so that it can be found via PATH when run from a script specified in package.json (often indirectly, e.g., via a specific loader for webpack). These packages cannot be used with Yarn Berry, even with
yarn unplug
(or even without Plug’n’Play altogether).Can Yarn provide a configuration option to skip the shell script shim for a particular executable?