-
Notifications
You must be signed in to change notification settings - Fork 12.8k
rootDirs should merge outputs #44321
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Well, so far it does look like adding the copy steps interferes with composite projects. To test I made a change to a shared project that causes a break in a project that references it while I was running When I make the change to the source file, tsc recompiles, but with no errors. (Because the files actually imported by the dependent project are the copies and they haven't changed yet?) If I run the copy step the imported files do change, but the edit: More complications with a monorepo / composite setup. On a clean build, when a dependent project builds it'll run It seems like |
Stating the obvious, probably: We can't just change this and break everyone's existing builds, so there'd have to be some new opt-in Less obvious, perhaps: This is tricky. We'd start to have to deal with what to do with conflicting output names. It's also unclear how relative-path module specifiers should work in this world -- does importing |
Yeah, changing I think there are good answers to the questions you raise:
This is how other src/gen overlay systems I've used work. It makes imports behave as if the generated files were generated directly into the source folders, which has the essential benefit of abstracting away whether a file is checked-in or generated. |
Suggestion
π Search Terms
rootDirs merge output
Related: #9875
β Viability Checklist
My suggestion meets these guidelines:
β Suggestion
rootDirs should merge outputs instead of emitting to the folders listed in rootDirs. This would be consistent with rootDir.
π Motivating Example
Starting point: single root
Let's say I start with a project with a
src/
folder:It has one rootDir and this config:
When I compile, the output goes to
./
and mirrors the structure of./src
:All well and good.
Friction point: add generated files
Now I want to add some generated .ts files to my project and keep them outside of
src/
for easier source control.I put a
.graphql
source file in mysrc/
tree, and set up the generator to output togen/
:Now I want the same output structure as before, but I want to compile the sources in
gen/
and output them as if I had"rootDir": "./gen"
.The first thing I try is to replace
"rootDir": "./src"
with"rootDirs": ["./src", "./gen"]
:but this unfortunately defaults
rootDir
to./
, puttingsrc/
and/gen
in the output paths and writing .js files as siblings to their .ts sources:This is very much not what I want or expect, and a big difference from the behavior of
rootDir
.What I expect is that
rootDirs
acts like a multi-valuerootDir
, and for each input the root dir that it's in is stripped from the output path.One additionally confusing aspect of
rootDir
vsrootDirs
is that"rootDir": "./src"
is not equivalent to"rootDirs": ["./src"]
. The former will cause output files to be siblings to inputs.It looks like to work around this we need to set
"outDir": "./build",
and then add an additional build step just to copy the files from./build/src
and./build/gen
into./
. This obviously can work but it's more of a complication than just a simple step:--watch
will no longer work correctly unless you wire up the copy step to automatically run when./build
files change. For a project with simple build scripts, this is a pretty big leap in complexity.Starting package.json:
Desired addition of a generator:
Actual addition of a generator, with broken --watch:
Actual addition of a generator, with working --watch:
π€·ββοΈ I have to go figure this out still. Also, I'm not sure if this will badly interact with a monorepo, composite projects, and --build. The cross-package import paths are going to be different from the compiler output.
Potential workaround
I tried setting
"rootDir": "./(src|gen)"
, hoping to tell tsc to strip those paths from the output. No luck as that path isn't interpreted as a pattern. That could potentially be a non-breaking way to add merging.π» Use Cases
Compiling generated files into a common output tree.
The text was updated successfully, but these errors were encountered: