Thread overview
dub sub-packages
May 06, 2015
Alessandro
May 06, 2015
Rikki Cattermole
May 08, 2015
Alessandro
May 06, 2015
Hi everyone,
I've been learning D for a few months now and really liked it :) !
Currently I'm experimenting with client/server application
development using the ZeroMQ library D wrapper called "zmqd".
Although I could successfully build the basic hello_world
application with a custom written Makefile using dmd/rdmd, I've
tried to use the DUB package manager to achieve the same goal,
but I'm having some issues with it.
By following the DUB documentation at
http://code.dlang.org/package-format#build-options I created a
main dub project called "hello_world" (dub init hello_world) and
set up two sub-packages therein called "client" and "server" (dub
init client|server).
Then I configured the three dub.json files as follows:
hello_world/dub.json:
{
	"name": "hello_world",
	"description": "Hello World client/server application using ZMQ",
	"targetType": "none",
	"dependencies": {
         	"hello_world:client": "*",
         	"hello_world:server": "*"
	},
	"subPackages": [
         	"./client/",
	        "./server/"
     ]
}

hello_world/client/dub.json:
{
	"name": "client",
	"description": "Hello World client application using ZMQ",
         "targetType": "executable",
         "sourceFiles": ["source/hwclient.d"],
	"dependencies": {
         	"zmqd": "~>1.0.0-alpha"
	}
}

hello_world/server/dub.json -> same as above with "server"
substituting "client"

With this setting, from within "hello_world" directory, I can
build client and server individually with:

$ dub build hello_world:client
$ dub build hello_world:server

but when I simply try:

$ dub build

to build the whole thing at once, I get an error saying:

Error executing command build:
Main package must have a binary target type, not none. Cannot
build.

But if I change the "targetType" to "executable" or "autodetect"
in hello_world/dub.json I get the error:

Configuration 'application' of package hello_world contains no
source files. Please add {"targetType": "none"} to it's package
description to avoid building it.
Error executing command build:
Main package must have a binary target type, not none. Cannot
build.

What shall I do to have all sub-packages automatically built when
I build the main package? Is there a way to specify a small bash
script to have custom commands executed when giving the "dub run"
command?

Sorry for the long post :( !
May 06, 2015
On 6/05/2015 11:39 p.m., Alessandro wrote:
> Hi everyone,
> I've been learning D for a few months now and really liked it :) !
> Currently I'm experimenting with client/server application
> development using the ZeroMQ library D wrapper called "zmqd".
> Although I could successfully build the basic hello_world
> application with a custom written Makefile using dmd/rdmd, I've
> tried to use the DUB package manager to achieve the same goal,
> but I'm having some issues with it.
> By following the DUB documentation at
> http://code.dlang.org/package-format#build-options I created a
> main dub project called "hello_world" (dub init hello_world) and
> set up two sub-packages therein called "client" and "server" (dub
> init client|server).
> Then I configured the three dub.json files as follows:
> hello_world/dub.json:
> {
>      "name": "hello_world",
>      "description": "Hello World client/server application using ZMQ",
>      "targetType": "none",
>      "dependencies": {
>               "hello_world:client": "*",
>               "hello_world:server": "*"
>      },
>      "subPackages": [
>               "./client/",
>              "./server/"
>       ]
> }
>
> hello_world/client/dub.json:
> {
>      "name": "client",
>      "description": "Hello World client application using ZMQ",
>           "targetType": "executable",
>           "sourceFiles": ["source/hwclient.d"],
>      "dependencies": {
>               "zmqd": "~>1.0.0-alpha"
>      }
> }
>
> hello_world/server/dub.json -> same as above with "server"
> substituting "client"
>
> With this setting, from within "hello_world" directory, I can
> build client and server individually with:
>
> $ dub build hello_world:client
> $ dub build hello_world:server
>
> but when I simply try:
>
> $ dub build
>
> to build the whole thing at once, I get an error saying:
>
> Error executing command build:
> Main package must have a binary target type, not none. Cannot
> build.
>
> But if I change the "targetType" to "executable" or "autodetect"
> in hello_world/dub.json I get the error:
>
> Configuration 'application' of package hello_world contains no
> source files. Please add {"targetType": "none"} to it's package
> description to avoid building it.
> Error executing command build:
> Main package must have a binary target type, not none. Cannot
> build.
>
> What shall I do to have all sub-packages automatically built when
> I build the main package? Is there a way to specify a small bash
> script to have custom commands executed when giving the "dub run"
> command?
>
> Sorry for the long post :( !

$ dub build hello_world:client ; dub build hello_world:server

Dub wasn't meant to build, more or less completely unrelated project targets at the same time.
May 08, 2015
On Wednesday, 6 May 2015 at 15:28:53 UTC, Rikki Cattermole wrote:
> On 6/05/2015 11:39 p.m., Alessandro wrote:
>> Hi everyone,
>> I've been learning D for a few months now and really liked it :) !
>> Currently I'm experimenting with client/server application
>> development using the ZeroMQ library D wrapper called "zmqd".
>> Although I could successfully build the basic hello_world
>> application with a custom written Makefile using dmd/rdmd, I've
>> tried to use the DUB package manager to achieve the same goal,
>> but I'm having some issues with it.
>> By following the DUB documentation at
>> http://code.dlang.org/package-format#build-options I created a
>> main dub project called "hello_world" (dub init hello_world) and
>> set up two sub-packages therein called "client" and "server" (dub
>> init client|server).
>> Then I configured the three dub.json files as follows:
>> hello_world/dub.json:
>> {
>>     "name": "hello_world",
>>     "description": "Hello World client/server application using ZMQ",
>>     "targetType": "none",
>>     "dependencies": {
>>              "hello_world:client": "*",
>>              "hello_world:server": "*"
>>     },
>>     "subPackages": [
>>              "./client/",
>>             "./server/"
>>      ]
>> }
>>
>> hello_world/client/dub.json:
>> {
>>     "name": "client",
>>     "description": "Hello World client application using ZMQ",
>>          "targetType": "executable",
>>          "sourceFiles": ["source/hwclient.d"],
>>     "dependencies": {
>>              "zmqd": "~>1.0.0-alpha"
>>     }
>> }
>>
>> hello_world/server/dub.json -> same as above with "server"
>> substituting "client"
>>
>> With this setting, from within "hello_world" directory, I can
>> build client and server individually with:
>>
>> $ dub build hello_world:client
>> $ dub build hello_world:server
>>
>> but when I simply try:
>>
>> $ dub build
>>
>> to build the whole thing at once, I get an error saying:
>>
>> Error executing command build:
>> Main package must have a binary target type, not none. Cannot
>> build.
>>
>> But if I change the "targetType" to "executable" or "autodetect"
>> in hello_world/dub.json I get the error:
>>
>> Configuration 'application' of package hello_world contains no
>> source files. Please add {"targetType": "none"} to it's package
>> description to avoid building it.
>> Error executing command build:
>> Main package must have a binary target type, not none. Cannot
>> build.
>>
>> What shall I do to have all sub-packages automatically built when
>> I build the main package? Is there a way to specify a small bash
>> script to have custom commands executed when giving the "dub run"
>> command?
>>
>> Sorry for the long post :( !
>
> $ dub build hello_world:client ; dub build hello_world:server
>
> Dub wasn't meant to build, more or less completely unrelated project targets at the same time.

Hi Rikki,
Thank you for your answer.
So it seems my DUB setup was a bit redundant.
If I well understood, there is no point in having the root hello_world DUB package setup in the first place. I could just stay with the client and server sub-projects living in their own sub-directories and orchestrate the whole build in one go by means of a custom Makefile from the root directory. This would also allow me to launch the client/server application for testing in a custom-defined way (e.g. launching several clients and a single server in parallel).