woutdp / live_svelte

Svelte inside Phoenix LiveView with seamless end-to-end reactivity
https://hexdocs.pm/live_svelte
MIT License
1.01k stars 38 forks source link

Creating files under assets/svelte/_build for ~V #69

Open dev-guy opened 10 months ago

dev-guy commented 10 months ago

assets/svelte/_build contains artifacts from llive views that use the ~V sigil.

This directory seems to be created when I run (among other mix commands) mix phx.server. However, this directory is not getting created. I'm using live_svelte version 0.11.0.

This has happened to me before and it "Just Started Working." However, I seem to have broken the ~V sigil's magic permanently this time.

dev-guy commented 10 months ago

I'd rather not have to do this, but this is the only thing that works when my project gets into this state:

rm -rf _build
mix setup
mix phx.server
woutdp commented 10 months ago

This is a regression probably. Need to investigate, thanks for reporting it!

vonagam commented 10 months ago

Don't think that this is a regression. I think it is because v sigil is a macro and gets called during compilation of a module. Copying of a script happens when module compiles. If you change module - it recompiles and macro copies new script. But if you've already compiled everything and nothing have changed in the module then it will not be recompiled and macro will not be called.

That's why deleting _build helps - it forces recompilation.

dev-guy commented 10 months ago

I deleted assets/svelte/_build and that was the beginning of my trouble. Here's what doesn't work after that (followed by mix setup; mix phx.server):

Deleting ./_build fixes the problem, but rebuilding takes too long. Is there a shortcut?

This is not a regression. This happened before 0.11.

vonagam commented 10 months ago

assets/svelte/_build is an artifact of building process. Why do you delete it?

Yeah, touching a relevant file will lead to its recompilation, I don't think there will be a better shortcut than that.

dev-guy commented 10 months ago

Touching / modifying .ex files with ~V sigil and running mix setup ; mix phx.server doesn’t create files in assets/svelte/_build when that directory is empty. It’s easy to reproduce. Just:

rm -rf assets/svelte/_build
  # modify or touch .ex files
mix setup 
mix phx.server 
vonagam commented 10 months ago

Ok, my bad, so there is an issue, modifying definitely should rerun macro...

dev-guy commented 10 months ago

I added some body text to my sigil template and that worked!

Touching files or adding whitespace, comments, etc. - anything that is removed by the compiler -- does not work.

I usually run into this bug when I switch branches. When the generated files for the ~V sigil are out of date, I delete the assets/svelte/_build directory hoping that they will be rebuilt. I used to just rebuild from an empty _build directory but I decided to put some time into poking it.

I don't think there's a bug if a file's timestamp goes "backwards" (which can happen with git pull). If the file's nontrivial content changes, the macro does create a build artifact. Although I think this has happened to me, I have not tried to reproduce it intentionally.

dev-guy commented 10 months ago

To recap:

  1. If you delete all files in assets/svelte/_build while the app is running and modify a *.ex file that contains a ~V sigil, assets/svelte/_build files are not created.
  2. If you remove assets/svelte/_build and start the app with mix phx.server, assets/svelte/_build files are also not created. IMO, this is the worst bug.

After deleting all files in assets/svelte/_build, the only known steps that result in assets/svelte/_build files are:

  1. Perform either or both of the following:
  1. Run mix phx.server