/** Empty package initialization code. Copyright: © 2013 rejectedsoftware e.K. License: Subject to the terms of the MIT license, as written in the included LICENSE.txt file. Authors: Sönke Ludwig */ module dub.init; import dub.internal.vibecompat.core.file; import dub.internal.vibecompat.core.log; import dub.package_ : packageInfoFilenames, defaultPackageFilename; import std.datetime; import std.exception; import std.file; import std.format; import std.process; import std.string; void initPackage(Path root_path, string type) { //Check to see if a target directory needs to be created if( !root_path.empty ){ if( !existsFile(root_path) ) createDirectory(root_path); } //Make sure we do not overwrite anything accidentally auto files = packageInfoFilenames ~ ["source/", "views/", "public/"]; foreach (fil; files) enforce(!existsFile(root_path ~ fil), "The target directory already contains a '"~fil~"' file. Aborting."); switch (type) { default: throw new Exception("Unknown package init type: "~type); case "minimal": initMinimalPackage(root_path); break; case "vibe.d": initVibeDPackage(root_path); break; } } void initMinimalPackage(Path root_path) { writePackageJson(root_path, "A minimal D application.", null); createDirectory(root_path ~ "source"); write((root_path ~ "source/app.d").toNativeString(), q{import std.stdio; void main() { writeln("Edit source/app.d to start your project."); } }); } void initVibeDPackage(Path root_path) { writePackageJson(root_path, "A simple vibe.d server application.", ["vibe-d": "~>0.7.19"], ["VibeDefaultMain"]); createDirectory(root_path ~ "source"); createDirectory(root_path ~ "views"); createDirectory(root_path ~ "public"); write((root_path ~ "source/app.d").toNativeString(), q{import vibe.d; shared static this() { auto settings = new HTTPServerSettings; settings.port = 8080; settings.bindAddresses = ["::1", "127.0.0.1"]; listenHTTP(settings, &hello); logInfo("Please open http://127.0.0.1:8080/ in your browser."); } void hello(HTTPServerRequest req, HTTPServerResponse res) { res.writeBody("Hello, World!"); } }); } void writePackageJson(Path root_path, string description, string[string] dependencies, string[] versions = null) { import std.algorithm : map; assert(!root_path.empty); string username; version (Windows) username = environment.get("USERNAME", "Peter Parker"); else username = environment.get("USER", "Peter Parker"); auto fil = openFile(root_path ~ defaultPackageFilename(), FileMode.Append); scope(exit) fil.close(); fil.formattedWrite("{\n\t\"name\": \"%s\",\n", root_path.head.toString().toLower()); fil.formattedWrite("\t\"description\": \"%s\",\n", description); fil.formattedWrite("\t\"copyright\": \"Copyright © %s, %s\",\n", Clock.currTime().year, username); fil.formattedWrite("\t\"authors\": [\"%s\"],\n", username); fil.formattedWrite("\t\"dependencies\": {"); bool first = true; foreach (dep, ver; dependencies) { if (first) first = false; else fil.write(","); fil.formattedWrite("\n\t\t\"%s\": \"%s\"", dep, ver); } fil.formattedWrite("\n\t}"); if (versions.length) fil.formattedWrite(",\n\t\"versions\": [%s]", versions.map!(v => `"`~v~`"`).join(", ")); fil.write("\n}\n"); }