All right, let me give this one more try. After last night's failed experiment with code organization for Dart web applications, Ladislav Thon suggested an alternate approach. And I think it makes a good deal of sense.
His suggestion was to stop trying to put stuff in the public directory. Instead, I ought to make the web subdirectory of my application code the "public" directory from which all HTML, CSS, and Dart is served. I make that happen in my
server.dart web server by updating the paths for my public directory handler. Then I move a bunch of code around, ending up with the following directory structure:➜ dart-comics git:(master) ✗ tree app
app
├── lib
│ ├── Collections.Comics.dart
│ ├── main.dart
│ ├── ModalDialog.dart
│ ├── Models.ComicBook.dart
│ ├── Views.AddComic.dart
│ ├── Views.AddComicForm.dart
│ └── Views.Comics.dart
├── packages
│ ├── hipster_mvc -> /home/chris/.pub-cache/hosted/pub.dartlang.org/hipster_mvc-0.2.0/lib
│ ├── scripts -> /home/chris/repos/dart-comics/app/lib
│ └── unittest -> /home/chris/.pub-cache/hosted/pub.dartlang.org/unittest-0.2.8+2/lib
├── pubspec.lock
├── pubspec.yaml
├── test
│ ├── <test code here>
└── web
├── dart.js
├── index.html
├── packages -> /home/chris/repos/dart-comics/app/packages
└── stylesheets
├── packages -> /home/chris/repos/dart-comics/app/packages
└── style.cssI update the index.html to point to the new locations of the JavaScript kicker and the main.dart file:<head> <title>Dart Comics</title> <link rel="stylesheet" href="/stylesheets/style.css"> <script src="/dart.js"></script> <script src="/packages/scripts/main.dart" type="application/dart"></script> </head>But that main.dart won't work there because I am reaching under the Dart Pub covers by sourcing main.dart from the packages path. The primary problem being that all of the associated libraries are not found. So I move it into
app/web as well.That almost works, but I still need to update the import paths in main.dart to pull from the "scripts" package:
import 'package:scripts/Collections.Comics.dart' as Collections;
import 'package:scripts/Views.Comics.dart' as Views;
import 'package:scripts/Views.AddComic.dart' as Views;
import 'dart:html';
import 'dart:json';
import 'package:hipster_mvc/hipster_sync.dart';
main() {
// ...
}It is the "scripts" package by virtue of the name listed in the pubspec.yaml in the app directory:name: scripts dependencies: hipster_mvc: any unittest: anyWitht that, I have my application back in business:
I think I can live with that application structure. Then end result is:
app
├── lib
│ ├── Collections.Comics.dart
│ ├── ModalDialog.dart
│ ├── Models.ComicBook.dart
│ ├── Views.AddComic.dart
│ ├── Views.AddComicForm.dart
│ └── Views.Comics.dart
├── packages
│ ├── hipster_mvc -> /home/chris/.pub-cache/hosted/pub.dartlang.org/hipster_mvc-0.2.0/lib
│ ├── scripts -> /home/chris/repos/dart-comics/app/lib
│ └── unittest -> /home/chris/.pub-cache/hosted/pub.dartlang.org/unittest-0.2.8+2/lib
├── pubspec.lock
├── pubspec.yaml
├── test
│ ├── HipsterCollectionTest.dart
│ ├── index.html
│ ├── packages -> /home/chris/repos/dart-comics/app/packages
│ └── Views.AddComicForm_test.dart
└── web
├── dart.js
├── index.html
├── main.dart
├── packages -> /home/chris/repos/dart-comics/app/packages
└── stylesheets
├── packages -> /home/chris/repos/dart-comics/app/packages
└── style.cssThe only thing about which I am unsure is including the main.dart file directly in the app/web directory. The old-fashioned way of doing that is putting it in a scripts directory. Maybe I am just stuck in my old ways and this is, in fact fine. Then again, it might be worth exploring a bit more tomorrow.Update: It turns out that moving dart.js and main.dart into
app/web/scripts works just fine. I just have to update the paths in index.html and re-run pub install to get the packages directory set up properly in app/web/scripts:└── web
├── index.html
├── packages -> /home/chris/repos/dart-comics/app/packages
├── scripts
│ ├── dart.js
│ ├── main.dart
│ └── packages -> /home/chris/repos/dart-comics/app/packages
└── stylesheets
├── packages -> /home/chris/repos/dart-comics/app/packages
└── style.cssThat also explains why stylesheets gets a packages symlink.Day #601

You can actually put the entrypoint Dart script into two places and both will make sense.
ReplyDeleteIf you want to include it in the page using <script src=".../main.dart" type="application/dart"></script>, then it makes sense to put it inside the 'web' directory, like you did.
You can also put it into the 'lib' directory and do something like this:
<script type="application/dart">
import 'package:app/main.dart' as app;
main() => app.main();
</script>
Depends on the taste, I'd say that both approaches are correct.
Heh. I've been avoiding the inline <script> thing for much the same reason that I disliked having main.dart in the same path as index.html — that's just not how this cranky old man has been doing it. But really, not being able to import directly in a script tag is a limitation of HTML, so this slightly awkward workaround might be OK.
DeleteI'll definitely play with it. Thanks!