On Sunday, 21 April 2024 at 16:41:08 UTC, Mike Parker wrote:
On Sunday, 21 April 2024 at 08:44:38 UTC, alex wrote:
Hi guys. Trying to play with vibe-d and want to create separate web app, and cli app which can add admin users. When I just keep both files app.d and cli.d in source folder, I get an error that I can't have more then 1 main function.


You can do this using configurations. Whichever you list first will be the default. Then you can use `-c configName` or `--config=configName` to build the other one.

You'll want to exclude one of the main functions when building the configuration to which it doesn't belong. You can do that with version specifications (e.g., add a `cli` version in the cli configuration, then `vesrion(cli) void main {...}` in the code). Alternatively, if the files the main functions are in are self-contained, then you can just exclude the one you don't need in each configuration with the `excludeSourceFiles` directive.

Configurations:
https://dub.pm/dub-guide/recipe/#configurations

Thanks, that really helped me.

For everyone who has the same trouble I can attach my working solution based on sub packages and configurations. Here is my dub.json:

```json
{
    "name": "cool",
        "subPackages": [
        {
            "name": "app",
            "sourcePaths": ["source"],
            "mainSourceFile": "source/app.d",
            "targetType": "executable",
                        "configurations": [
                                {
                                        "name": "app",
                                        "targetType": "executable",
                                        "versions": ["app"]
                                }
                        ]
        },
        {
            "name": "cli",
            "sourcePaths": ["source"],
            "mainSourceFile": "source/cli.d",
            "targetType": "executable",
                        "configurations": [
                                {
                                        "name": "cli",
                                        "targetType": "executable",
                                        "versions": ["cli"]
                                }
                        ]
        }
    ]
}
```

Main functions:
app.d:
```d
  version(app)
  void main() {...}
```

cli.d:
```d
  version(cli)
  void main() {...}
```

And here how I run/build it:
```make
dub run :cli
dub run :app
```
OR
```make
dub build :cli
dub build :app
```

During building, it will create executable like "{name_of_project}_app" or "{name_of_project}_cli".

Reply via email to