Allow to use filesystem polling in watch mode (was: Debug in Docker)
barfet opened this issue · comments
Hi guys,
Thanks for your efforts in this project.
I have created a question in related sls project serverless-offline
and will duplicate it here, because of adjacent functionality.
dherault/serverless-offline#300
It would be great to hear some thoughts regarding the topic.
Thanks!
@barfet Thanks for the kick-off of the topic 🙌 . You should base your tests on version 3 of the plugin which will be released end of this week (a stable rc is already available at 3.0.0-rc.2
).
The new version features full integration with sls invoke local
which also can be executed with --inspect
to run any function locally with a given event.json. Additionally it integrates much better with serverless-offline
because it sets the --location
option automatically and it turned out that source mapping now works correctly.
@HyperBrain thanks for the info, great stuff in V3! But, the use of serverless-offline
is preferable for us, because we could emulate dev environment with it. Actually I'm in the final step for creating an interacting development setup. I moved from node-inspector
to VS Code Debug
and was able to create desired functionality but only with tsc
compilation with serverless-plugin-typescript
. (running sls offline in docker, attaching to Dokcer with VS Code and recompiling the sources and reattaching the debug automatically in VS Code).
But I have an issue with serverless-webpack
. I run Docker container with next script nodemon --legacy-watch --watch ./.build --debug=0.0.0.0:5858 --nolazy node_modules/.bin/serverless offline start
witch need to restart sls offline in case of file changes in .build
folder. This is perfectly working with serverless-offline
and serverless-plugin-typescript
, but when I changing sls typescript
to sls webpack
it didn't fire any webpack recompilation in case of changes.
Do you support this kind of scenario? (recompilation source files when sls offline processes is already started)? As I said this is perfectly working but just with tsc
compilation.
Thanks!
In general, serverless-offline start
should automatically rebuild and recompile the code automatically. We use that locally a lot. You do not need the serverless webpack
command at all, as the hooks of serverless-offline
should take care of that in the background (when serverless-webpack
is enabled as plugin in your project).
You should not need to trigger serverless-offline
itself with a watch command. Just let it run.
FYI: This is the only command we run:
serverless offline --noTimeout --dontPrintOutput
This starts the APIG endpoint emulation and automatically rebuilds the sources with webpack on any source changes. It should not matter if you use offline
or offline start
here. So you have the APIG emulation running and the automatic rebuilds.
In theory this should also work, if you enable Node's debug mode.
Here's a sample screen output of serverless-offline:
Serverless: Offline listening on http://localhost:3000
Hash: 41cebafab87a10be924d
Version: webpack 3.5.5
Time: 7822ms
Asset Size Chunks Chunk Names
handlers/serve/handler.js 597 kB 0 [emitted] [big] handlers/serve/handler
handlers/auth/handler.js 10.5 kB 1 [emitted] handlers/auth/handler
handlers/serve/handler.js.map 390 kB 0 [emitted] handlers/serve/handler
handlers/auth/handler.js.map 6.93 kB 1 [emitted] handlers/auth/handler
[...]
!!!!================================
!!!! HERE I CHANGED A SOURCE FILE AND SAVED IT
!!!!================================
Hash: 41cebafab87a10be924d
Version: webpack 3.5.5
Time: 307ms
Asset Size Chunks Chunk Names
handlers/serve/handler.js 597 kB 0 [big] handlers/serve/handler
handlers/auth/handler.js 10.5 kB 1 handlers/auth/handler
handlers/serve/handler.js.map 390 kB 0 handlers/serve/handler
handlers/auth/handler.js.map 6.93 kB 1 handlers/auth/handler
[...]
So you see, as soon as the file changed, serverless offline + serverless webpack
automatically triggered a recompile and the new handler is immediately testable on the local APIG endpoint
@HyperBrain Thanks for the detailed explanation! I tried your approach and it's perfectly working without Docker (on file changes Webpack is triggered and recompiled), but when I run the same inside of Docker container with volumes mapping than webpack doesn't recompile when files was modified in host machine. But is recompiling when I manually modify them inside the container. Maybe you faced something similar?
That's an interesting behavior. I never used the watch mechanism on a mapped volume though.
I'll do some tests and try to find out why the filesystem events do not seem to work on mapped volumes, or if there's a special trick to enable that.
It may be the same issue as nodemon
dealt with --legacy-watch
flag. (Chokidar's polling)
https://github.com/remy/nodemon#application-isnt-restarting
https://github.com/paulmillr/chokidar#performance
I see. Just checked the webpack API watch configuration options here.
It seems that it is possible to switch webpack's file watch to poll mode too.
I think we can add this as a feature to serverless-webpack
, so that you can explicitly enable polling instead of event listening. I'm not quite sure what would be the best integration of such a switch.
Maybe a commandline option --webpack-use-polling
would be the best way, that you can set on you invocation of serverless.
I will change the topic of this issue - because eventually it is about "Allow to use polling for watch mode" and flag it as feature. This should solve your problem completely.
Can you comment our findings in dherault/serverless-offline#300, because it can be solved completely in serverless-webpack
as far as I see it.
--webpack-use-polling
command will be great to have. Thanks again for such quick feedback!
I'll add a comment in sls offline repo.
Released with 3.1.0