Yesterday, I was able to deploy my full-stack Dart application to Heroku, thanks to the heroku-buildpack-dart. That buildpack installed Dart Pub dependencies on the server-side. I forked the buildpack so that I could get it to install client-side dependencies as well.
My fork was coupled to the current layout of my Dart Comics sample app. Today, I would like to generalize it to work regardless of layout. Ultimately, I will submit a pull request back to the original repository, but mostly I do not want to be tied to my current layout.
As far as I know, the only way to test buildpacks is to push a change to a repository using said buildpack. I am new to the world of Heroku buildpacks, so there may be a better way, but this is the limitation that I have to live with for now. As such, I hope to perform very few actual deploys. Instead, I write a bash script to run locally. Once it does what I expect, I will copy it in the buildpack's compile script.
What I need is for the buildpack to run through my entire app looking for Dart Pub pubspec.yaml files. In any directory with one such file, I want the buildpack to run
pub install
. Lastly, if that directory also has a web
sub-directory, I need the buildpack to create a relative symbolic link (otherwise it results in a broken link to a build path). Starting with just running
pub install
in directories with pubspec.yaml
files, I use the following bash code:root_dir=`pwd` for filename in `find . -name pubspec.yaml`; do pub_dir=`dirname $filename` echo "Found pubspec.yaml in $root_dir/$pub_dir" cd $root_dir/$pub_dir pub install doneRunning that in my local copy of Dart Comics, I see that it does, in fact, find both
pubspec.yaml
files and install the requisite dependencies:➜ dart-comics git:(master) ~/bin/pub.sh Found pubspec.yaml in /home/chris/repos/dart-comics/. Resolving dependencies... Dependencies installed! Found pubspec.yaml in /home/chris/repos/dart-comics/./public/scripts Resolving dependencies... Dependencies installed!To check for the existence of the
web
sub-direction, I use the -e
bash function:root_dir=`pwd` for filename in `find . -name pubspec.yaml`; do pub_dir=`dirname $filename` echo "Found pubspec.yaml in $root_dir/$pub_dir" cd $root_dir/$pub_dir pub install if [ -e $root_dir/$pub_dir/web/packages ]; then cd $root_dir/$pub_dir/web echo -n '*** ' pwd fi doneAnd that also does the trick as I see my multi-asterisked tracer bullet:
➜ dart-comics git:(master) ~/bin/pub.sh Found pubspec.yaml in /home/chris/repos/dart-comics/. Resolving dependencies... Dependencies installed! Found pubspec.yaml in /home/chris/repos/dart-comics/./public/scripts Resolving dependencies... Dependencies installed! *** /home/chris/repos/dart-comics/public/scripts/webNow for the moment of truth, I adopt this in the buildpack's
compile
script:message "-----> Install packages" cd $BUILD_DIR for filename in `find . -name pubspec.yaml | grep -v dart-sdk | grep -v pub-cache `; do pub_dir=`dirname $filename` message "*** Found pubspec.yaml in $BUILD_DIR/$pub_dir" cd $BUILD_DIR/$pub_dir #start pub from the /app folder to have correct symlink paths /app/dart-sdk/bin/pub install if [ -e $BUILD_DIR/$pub_dir/web/packages ]; then cd $BUILD_DIR/$pub_dir/web ln -sf ../packages message "Fixed web symlink" fi doneFor the most part this is a combination of my test bash script and my work from yesterday. The only slight change is the inclusion of two
grep -v
(exclude) statements in the find
command. With those, I hope to avoid installing SDK and already installed Pub dependencies. I commit that to my fork, make a small change to Dart Comics and:➜ dart-comics git:(master) gp heroku master Counting objects: 5, done. Delta compression using up to 4 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 316 bytes, done. Total 3 (delta 2), reused 0 (delta 0) -----> Heroku receiving push -----> Fetching custom git buildpack... done -----> Dart app detected -----> Installing Dart VM, build: latest -----> Copy Dart binaries to app root -----> Install packages *** Found pubspec.yaml in /tmp/build_6bf4s9ejuogj/. Resolving dependencies... Dependencies installed! *** Found pubspec.yaml in /tmp/build_6bf4s9ejuogj/./public/scripts Resolving dependencies... Dependencies installed! Fixed web symlink -----> Discovering process types Procfile declares types -> web -----> Compiled slug size: 6.2MB -----> Launching... done, v15 http://dart-comics.herokuapp.com deployed to HerokuYay! That looks to have done the trick. A quick load of the site in Dartium verifies that all is well -- both with the client-side and server-side packages. I do believe that I am good to go.
Day #586
No comments:
Post a Comment