Source and npm sripts - bash

I wrote the script in package.json
"scripts": {
"build": ". ./envsetup.sh | ./build"
}
when in envsetup.sh script I set variables and I want to share them in build script.
If I run it by npm run build I see KeyError the variable does not exist.
But if I run this script in console by 2 commands:
. ./envsetup.sh
./build
the script is successful.

You can't use a pipe here. This should work though:
"scripts": {
"build": ". ./envsetup.sh && ./build"
}

Related

How to replace text in file with npm run scripts in package.json Windows OS

I developed chrome extension using Nextjs and My develop environment is Windows.
But I have issue when build and export the app and load it on extension because cannot load extension with file or directory name _next.
So need to move the _next file to 'assets' file and replace '_next' to 'assets' in index.html.
I installed sed-4.2.1 and added these lines in "scripts" of package.json
"scripts": {
"build": "next build && next export && npm run prepare",
"prepare": "move out/_next out/assets && sed -i 's/\\/_next/\\/assets/g' out/index.html"}
But 'sed' not worked with this error: sed: -e expression #1, char 1: unknown command: `''
So, I tried to run 'perl -p -i -e's/_next/assets/g' out/index.html' on cmd and it worked well.
But I added line in scripts, it has not worked.
"scripts": {
"build": "next build && next export && npm run prepare",
"prepare": "move out/_next out/assets && perl -p -i -e's/_next/assets/g' out/index.html"}
What's the reason?
And what is the best way to replace text???

Pass text file as CLI argument in NPM script in GitHub action

I have very long cmd command in npm script and I try to extract some part of it into text file, and then pass its content as arguments.
"build": "npm-run-all --print-label $(< build-order.txt)",
It is working locally, but when i run this command on GitHub action nothing happens
There is not errors, just nothing.
I used https://github.com/marketplace/actions/debugging-with-tmate to try to run this command in terminal and when i just execute pnpm npm-run-all --print-label $(< build-order.txt) it is working, but when just pnpm build again nothing happens. It feels like something wrong with running npm script itself on github action.
Looks like there was some issue on GitHub actions, this helped
"build": "npm-run-all --print-label $(cat build-order.txt)",

NPM call bash script with multiple arguments

I have created a bash script to automate the git release flow. This script takes one or multiple branch names as argument.
I can call the script in the terminal with: ./releaseGit.sh -b branch1 -b branch2
But I want to use the script with npm. My current package.json contains:
"scripts": {
(other scripts..)
"git-release": "scripts/releaseGit.sh -b $*"
}
But with this configuration I can only pass one branch as argument to the script. How can I change that?
works:
npm run git-release -b only-one-branch
Doesn't work:
npm run git-release -b first-branch -b second-branch
Package.json:
scripts: {
test: "sh init.sh"
}
Pass args:
npm run test -- a b c

yarn run script with parameters

How do I pass a parameter? When I run "yarn generate" it will make both a "-p" and a "test" directory. But it works well when I run "mkdir -p test" in bash. I tried to [-p] as well but it only creates that directory.
"scripts": {
"generate": "mkdir -p test"
}
Although I could not reproduce the issue that you mentioned (my config: node v8.11.1 and yarn v1.2.1, latest MacOS), according to the yarn docs, you can pass the arguments to yarn script by appending them normally, like so:
yarn generate -p test
In this case your npm (yarn) scripts config (in the package.json, I assume) would look like
"scripts": {
"generate": "mkdir"
}
If you're using Windows, you indeed won't have the mkdir -p flag (read this). In order to make what you want (check if the folder does not exist and if so, create one) you'd need to use some cmd commands. So your package.json will contain smth like
"scripts": {
"generate": "IF NOT EXIST test mkdir test"
}

How to set shell for npm run-scripts in Windows

I'm running npm on Windows and would like to use & style parallel operations in run-scripts
but running in parallel in cmd is kind of messy
in my package.json file I'd like to write-
scripts: { "go": "cmd1 & cmd2"}
but npm executes the script under cmd.exe which does not know about ; I could change this to
scripts: { "go": "bats/bat1.bat") where bat1.bat is a cmd bat file that uses the windows style call or start commands to run commands in parallel. which works but gives me a script that only works on Windows.
It would be a lot simpler if I could get npm to run the script under a bash clone or cygwin.
I tried
config: { "shell": "bash"}
but that still ran cmd.exe
Is there any way to tell npm to run-scripts using a specific shell (not cmd.exe)?
Since npm 5.1
npm config set script-shell "C:\\Program Files (x86)\\git\\bin\\bash.exe"
or (64bit installation)
npm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe"
Note that you need to have git for windows installed.
You can revert it by running:
npm config delete script-shell
Here's one way to do it:
Create a script, such as my_script.sh, in your project bin directory.
In your package.json file, add a line to run the script using bash. For example:
"scripts": {
"boogie": "bash bin/my_script.sh"
}
Now you can run your bash script from npm by:
npm run-script boogie
Not very elegant, but it works.
If you are developing in both Windows and Linux/Unix, then at least this approach is fairly portable to both environments.
Ideally, overriding the npm shell config parameter should work, but npm (at least version 1.4.14) seems in Windows to ignore the setting and use cmd.exe instead.
Use the following command in your bash or Git Bash shell to find out the shell setting:
$ npm config ls -l | grep shell
By default, the output will be:
shell = "C:\\WINDOWS\\system32\\cmd.exe"
However, to override the default shell parameter, you can add (or edit) an npmrc file to the \Users\yourusername\AppData\Roaming\npm\etc directory. Just add the following line:
shell = "C:\\Program Files (x86)\\git\\bin\\bash.exe"
The path you use can be any valid path to bash.exe. Now, if you run the above "npm config ls -l | grep shell" command, you will see the following output, indicating that the shell parameter has been overriden:
shell = "C:\\Program Files (x86)\\git\\bin\\bash.exe"
; shell = "C:\\WINDOWS\\system32\\cmd.exe" (overridden)
One day, perhaps, a new version of npm will pay attention to the overridden shell parameter.
You can also use cross-platform powershell https://github.com/powershell/powershell#get-powershell for npm scripts.
To set for single project, run this from project root folder:
npm config set script-shell pwsh --userconfig ./.npmrc
To globally set for all node projects:
npm config set script-shell pwsh [--global]
just using CMD's way to run .bat!
.json
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject",
"app": "cd build & browser-sync start --server --files 'index.html'",
"bat": "start start-browser.bat",
"starts": "start http://localhost:7777/datas/ && start http://localhost:7777/Info/"
},
.bat
start http://localhost:7777/datas/ && start http://localhost:7777/Info/
Use a specifically created node_module for this purpose. I suggest using npm-run-all, but others exists, such as parallelshell.
Parallelshell example is below for drop-in-replacement for your question.
"scripts": {
"parallelexample1": "parallelshell \"echo 1\" \"echo 2\" \"echo 3\""
},
following command:
npm run parallelexample1
works both on windows and unix(Linux/MacOS).
Interestingly npm-run-all does not support shell commands; therefore we need to put all shell commands to separate scripts like below.
"scripts": {
"parallelexample2": "npm-run-all echo*",
"echo1": "echo 1",
"echo2": "echo 2",
"echo3": "echo 3"
},
Following command:
npm run parallelexample2
works both on windows and unix(Linux/MacOS).
In my case I just needed to run npm start from inside Bash. I run cmd then I open bash by running "c:\Program Files\Git\bin\bash.exe". Under bash shell I then was able to call npm build and npm start succesfully.
You may already have bash if you are using Git. If not, you can install it.
Hope this may save someone's time.

Resources