PyCharm Run npm command that compiles js and runs django collectstatic?
I am using PyCharm Professional.
I have a Javascript file named myscript.js.
In package.json, I have this scripts section:
"scripts": {
"build": "parcel build content/static/content/js/s3direct.js --dist-dir content/static/content/dist/",
"cs": "python manage.py collectstatic --no-input --ignore content/scss*",
"bp": "npm run build & npm run cs"
},
Each time I make a change to myscript.js, I go to the terminal and type:
npm run bp
Using File Watchers, or some other way, how can I run **npm run bp** automatically without having to type it out in the terminal each time?
I realize there might be a more efficient workflow, but I am testing AWS S3 buckets and prefer to test on the live bucket for what I'm doing right now.
Please sign in to leave a comment.
It can be a file watcher, like
here the "main" scope is a scope configured in Settings | Appearance & Behavior | Scopes that includes your script file only; working folder is set to the project root directory assuming you have the package.json with your scripts located there; if it's located in a subfolder, change the working directory accordingly
I am so appreciative of your help Elena. I am 90% of the way there thanks to you.
When the file watcher executes, an "Output" window appears.
It shows the following output:
----------------------------------------- start output ----------------------------------------------
"C:\Program Files\nodejs\node.exe" "C:\Program Files\nodejs\node_modules\npm\bin\npm-cli.js" run bp
> aws_vod@1.0.0 bp
> npm run build & npm run cs
> aws_vod@1.0.0 build C:\Users\Jarad\Documents\PyCharm\aws_vod
> parcel build content/static/content/js/s3direct.js --dist-dir content/static/content/dist/
Building...
√ Built in 1.40s
content\static\content\dist\s3direct.js 89.47 KB 1.64s
content\static\content\dist\s3direct.css 1.61 KB 2.88s
> aws_vod@1.0.0 cs C:\Users\Jarad\Documents\PyCharm\aws_vod
> python manage.py collectstatic --no-input --ignore content/scss*
Traceback (most recent call last):
File "manage.py", line 11, in main
from django.core.management import execute_from_command_line
ModuleNotFoundError: No module named 'django'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "manage.py", line 22, in <module>
main()
File "manage.py", line 17, in main
) from exc
ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment?
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! aws_vod@1.0.0 cs: `python manage.py collectstatic --no-input --ignore content/scss*`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the aws_vod@1.0.0 cs script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! C:\Users\Jarad\AppData\Local\npm-cache\_logs\2021-12-10T18_49_41_906Z-debug.log
Process finished with exit code 1
----------------------------------------- end output ----------------------------------------------
I understand this to mean that 1) my npm build command did work as evidence by the "Building..." section but 2) I need to activate my virtual environment somehow so Django is imported.
I modified the "Arguments" line (see your screenshot above) to this:
source "C:\Users\Jarad\Documents\PyCharm\aws_vod\venv\Scripts\activate" && "C:\Program Files\nodejs\node_modules\npm\bin\npm-cli.js" run bp
but it did not work. I am on a Windows machine (if that means anything - usually I don't have to type "source /bin/activate").
I guess the question is, how to I activate the virtual environment in the file watcher argument?
If I do this:
venv\Scripts\activate && "C:\Program Files\nodejs\node_modules\npm\bin\npm-cli.js" run bp
I get this error:
"C:\Program Files\nodejs\node.exe" venv\Scripts\activate && "C:\Program Files\nodejs\node_modules\npm\bin\npm-cli.js" run bp
C:\Users\Jarad\Documents\PyCharm\aws_vod\venv\Scripts\activate:1
# This file must be used with "source bin/activate" *from bash*
^
SyntaxError: Invalid or unexpected token
at Object.compileFunction (node:vm:352:18)
at wrapSafe (node:internal/modules/cjs/loader:1031:15)
at Module._compile (node:internal/modules/cjs/loader:1065:27)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:17:47
Process finished with exit code 1
----------------
Now that I think about it, I guess this is a node.exe trying to execute the activation of a Python virtualenvironment. I realize that probably makes no sense to try to do. Just not sure what to do.
You can't pass venv\Scripts\activate as an argument to Node.js, your command is invalid
I can only suggest creating a batch script (.cmd or .bat file) that would activate the virtualenv first and then start the npm script, and set this script as a program in your file watcher
Well, actually you can try adding venv\Scripts\activate to your bp npm script
YES! Adding
worked! This was my file watcher configuration for anyone in the future (and me).
As always, thanks Elena. You saved me a lot of time again.