gradle-node-plugin
gradle-node-plugin copied to clipboard
npmInstall ignores npm workspaces in up-to-date detection
We have a monorepo with multiple workspaces. The workspaces also reflect the gradle (sub)project structure. Our project structure looks like this:
build.gradle
package.json
package-lock.json
node_modules/
scripts/
\_ build.gradle
|_ package.json
The root package.json defined scripts/ as a workspace:
"workspaces": [
"scripts"
]
We apply the gradle-node-plugin in the scripts/build.gradle like this:
node {
nodeProjectDir = rootProject.projectDir
}
task compile(type: NpmTask) {
dependsOn = [tasks.npmInstall]
workingDir = rootProject.projectDir
args = [
"run",
"build",
]
}
The problem is that npmInstall only registers changes to the root package.json etc., but not to scripts/package.json etc.
So if I change a dependency in scripts/package.json, npmInstall might not run.
It would be nice if the npmInstall task could check for changes in package.json etc. in all workspaces defined in the root package.json as well.
Currently, we need this workaround:
npmInstall {
outputs.upToDateWhen {false}
}
I don't think the problem is related to our unusual project structure, but likely affects every situation where NPM workspaces are involved - NpmInstallTask just doesn't seem to consider changes to workspace files / npm files outside of nodeProjectDir at all.
Ditto for yarn workspaces. I need to tell gradle-node-plugin to use a subfolder for package.json and root for the lock file.
I just changed my module setup and now I am encountering this.
When running a NpxTask in CI I get:
npm error could not determine executable to run
It seems, it is because I have the relevant dependency defined in the parent module.