Open stalniy opened 4 years ago
I can add outputFolder
option back so you can set global folder once, but you'll still need to set it (duplicate). Don't know a way to make autodetection since outputOptions
can't be used with hook option.
What do you think?
Hi everyone,
If I may, I think that something like a dest
global option could be great.
import {resolve} from "path";
const src = (...paths) => resolve("src", ...paths);
export default {
plugins: [
copy({
dest: resolve("dist"),
targets: [
src("index.html"),
src("service-worker.js"),
src("manifest.webmanifest"),
{
src: resolve("something", "else.json"),
dest: resolve("somewhere", "else")
}
]
})
]
}
This would have the advantage of being really concise and reduce the code written for copying multiple files to a similar location. Plus (but I'm really unsure about that) we could maybe use this plugin multiple times for multiple shared folders (while keeping the actual behavior).
import {resolve} from "path";
const src = (...paths) => resolve("src", ...paths);
const dist = (...paths) => resolve("dist", ...paths);
export default {
plugins: [
copy({
dest: dist("client"),
targets: [
src("foo"),
src("bar"),
src("baz")
]
}),
copy({
dest: dist("server"),
targets: [
src("foo"),
src("bar"),
src("baz")
]
})
]
}
As a workaround, I have found to be used this little function a lot in my Rollup projects. Here is the code snippet.
import {path} from "path";
const dist = (...paths) => resolve("path", "to", "dist", ...paths);
dist("client", "index.js"); // ./path/to/dist/client/index.js
dist("server", "main.js"); // ./path/to/dist/server/main.js
This also work independently on whether you are using GNU/Linux, Mac OS X or Windows since resolve
will join the strings with the correct delimiter for the current operating system using path.sep
.
I Hope it helps while a solution is found.
@vladshcherbin Hey, I've worked around this allowing to specify function as dest
:
import RollupPluginCopy from "rollup-plugin-copy"
/** @param {import("rollup-plugin-copy").CopyOptions} options */
function copy(options) {
options.hook ??= "buildEnd"
return {
[options.hook](...args) {
options.targets = options.targets.map(({ dest, ...target }) => ({
...target,
dest: typeof dest === "function" ? dest(...args) : dest,
}))
const plugin = RollupPluginCopy(options)
return plugin[options.hook](...args)
},
}
}
export default {
plugins: [copy({
hook: "writeBundle",
targets: [{
src: "some/folder/files.*",
dest: cfg => cfg.dir,
})
}]
}
Feel free to borrow the idea ;)
Currently I need to prepend every
dest
field withdist/
folder, so I do duplicate where I plan to output files in several places (dest
fields and output options of rollup).Rollup has
outputOptions
hook which can be used to obtain directory from that options. So, I don't need to duplicate it.There are 2 possible cases:
output.file
is specified -dirname(ouput.file)
output.dir
is specified - just use this dir as a root path.