In the script section of my package.json
file, I'm trying to rename some files in a directory, however I would like to inject a value in the command line that is taken from the package.json
itself (version).
So in the case below, the build:rename
script, I would like it to replace a token in the script (somevalue
) before executing it.
In this case I would like to pass in the npm_package_version
so that it's part of the name of the file. I'm at a loss...
"scripts": {
"build:copy": "mkdirp dist && cp src/*.js dist/",
"build:rename": "renamer --regex --find '(.+)(.js)' --replace '$1**somevalue**$2' dist/*"
}
The current version
specified in package.json
can be referenced via the script using package.json vars as follows:
bash
In bash shells using the syntax - (note the dollar $
prefix):
$npm_package_version
Windows
In cmd.exe and Powershell using the syntax - (note the percentage %
prefix and suffix):
%npm_package_version%
cross-patform
To achieve this cross-platform utlize cross-var:
$ npm i -D cross-var
The build:rename
script can be revised as follows:
"scripts": {
...
"build:rename": "cross-var \"renamer --regex --find '\\.js$' --replace '$npm_package_version.js' dist/*\""
},
Note: the additional change to the --find
regular expression as cross-var
doesn't seem to play nice when the --replace
value includes dollar references ($1
, $2
) to the parenthesised substrings/groups in the --find
value. The new regex simply matches the files/strings part ending in .js
instead.
Example directory
Running the updated build:rename
script, (when the version
in package.json
is 0.3.0
), will rename the .js
files in the dist
directory from this:
.
├── dist
│ ├── a.html
│ ├── b.css
│ ├── foo.js
│ ├── bar.js
│ └── quux.js
...to this:
.
├── dist
│ ├── a.html
│ ├── b.css
│ ├── foo0.3.0.js
│ ├── bar0.3.0.js
│ └── quux0.3.0.js
Additional note
The cp command used in the build:copy
script will also not work cross-platform. This can be substituted with the copyfiles package:
$ npm i -D copyfiles
... and the build:copy
script then replaced with the following:
"scripts": {
"build:copy": "copyfiles -u 1 \"src/*.js\" \"dist\"",
...
},
The mkdirp dist &&
part in your script then becomes redundant as copyfiles
with create the necessary directory (i.e. dist
).
If cross-platform is not necessary for your use-case then simply leave the build:copy
script as-is, and change your build:rename
script to:
"build:rename": "renamer --regex --find '\\.js$' --replace $npm_package_version'.js' dist/*"
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With