On Monday, 6 January 2025 at 03:04:40 UTC, Chris Piker wrote:
> Here's what I ended up doing in case it's either useful for others, or a really bad idea and serves as an anti-example.
- For context, the working directory has roughly this setup (after git submodule calls):
git-root
|-- main_project
|-- deps/
| |-- vibe-serialization
| |-- ... more here
|
|-- makefile
- Add dependencies as git submodules, for example:
git submodule add https://github.com/vibe-d/vibe-serialization deps/vibe-serialization
# more here
- In the top level build file (makefile in my case) the following happens:
dub add-local vibe-serialization 1.0.7
# More locals added here
cd main_project && dub --skip-registry=all build
dub remove-local vibe-serialization
# more locals removed here
- On a regular basis:
rm -r $HOME/.dub
You never know what could be hiding in there.
A person can just cd main_project && dub build
and standard things will happen, i.e. dependencies will be downloaded from the internet. However in a production setting make
is run from the top level and only the dependencies specified in the sub modules are used.
This should work unless two builds are happening at the same time in the same account since add-local
and remove-local
are user-wide and affect an entire user's home directory at a time. Not too bad if the user is a real person, terrible if it's the account used by a build host.
It works, but I'm sure there's a better way.
There is nothing wrong with your example, having two ways to build artifacts maybe confusing but this is just fine, except maybe that you should clearly state your intentions and name scripts/makefile accordingly (e.g. build_prod.sh/build_dev.sh or something, meaning that is it only going to work in specific environment because this is a part of specific procedure)
There is a problem with dub add-local
though, it is only useful for developer on that same machine while tinkering with problematic packages. But this is an extra step that is easily can be forgotten leading to confusion.
I think it can be avoided entirely by simply setting explicit paths to dependencies in dub.selections.json
(not suitable for library projects as you can't freeze version for your users), not sure if it will actually work with relative paths but I guess it should.
dub.selection.json:
{
"fileVersion": 1,
"versions": {
"godot-dlang": {"path":"C:/godot/bin/godot-dlang"},
"intel-intrinsics": "1.11.18",
"pyd": "~master"
}
}