If you build Chrome extensions, you probably understand it’s a bit of a pain in the bum having to move all the files into the right place (especially if you have shared assets elsewhere), keep track of versions of your package, update your update.xml, and packaging it all up into a .crx and a .zip for publishing on the Chrome webstore. I found a it a pain in the bum anyway, so I wrote a bash script to simplify the build process a bit.
It pumps out a .crx (signed with your .pem, ready for hosting on your site) and a .zip (ready for uploading to the Chrome Store).
Here it is – it should work under linux and cygwin, let me know if you have any issues in the comments 🙂 – instructions at the top of the file.
Click here to download a copy of it.
There’s an example of how to use it at the end of this post.
crx_build.sh Chrome extension build script
#!/bin/bash # Author Seb Maynard, 2012 # https://seb.so # # Script to generate and package CRX chrome extensions and zip files ready for upload # requires updates.xml, manifest.json in current folder - these shouldn't reference a version number, # but instead have xxxxxxx where the version number will be replaced in. # # This should work on cygwin and *nix # # required variables are # $version (appended to the built filenames - like 0.0.1) # $files (should be an array of files to include - like (updates.xml somefile.txt ../someotherfile.txt) ) # $modulename # # when this script has finished running, 2 variables will be availabe for use: # $filename_crx # $filename_zip # which can then be used (for example) to automatically update your server with the new files # dependency checks if [ "$version" == "" ] ; then echo "Need a version variable (version=...)" exit fi if [ "$files" == "" ] ; then echo "Need a list of files (files=...)" exit fi if [ "$modulename" == "" ] ; then echo "Need a modulename (modulename=...)" exit fi # Copy in the files we need rm -r dist_tmp mkdir dist_tmp for i in "${files[@]}" do cp "$i" dist_tmp/ done # Sort out the version numbers echo Building dist_tmp folder cd dist_tmp sed -i "s/xxxxxxx/$version/g" updates.xml sed -i "s/xxxxxxx/$version/g" manifest.json cd .. # build the Chrome crx for distribution echo Building Chrome crx chrome_run=`which google-chrome 2>/dev/null` cygwin= if [ ! -f "$chrome_run" ] ; then cygwin=yes chrome_run=`cygpath -u "$APPDATA/../Local/Google/Chrome/Application/chrome.exe"` fi if [ -f "$chrome_run" ] ; then path_dist_tmp=`pwd`/dist_tmp path_key=`pwd`/$modulename.pem if [ "$cygwin" == "yes" ] ; then path_dist_tmp=`cygpath -w $path_dist_tmp` path_key=`cygpath -w $path_key` fi echo Building dist_tmp.crx in $path_dist_tmp $chrome_run --no-message-box --pack-extension=$path_dist_tmp --pack-extension-key=$path_key filename_crx=$modulename-$version.crx if [ -f "$filename_crx" ] ; then echo $filename_crx already exists\! Skipping rename else mv dist_tmp.crx $filename_crx echo Built $filename_crx fi else echo "Couldn't find Chrome!" fi # Build the zip for uploading cd dist_tmp filename_zip=$modulename-$version.zip if [ -f "../$filename_zip" ] ; then echo $filename_zip already exists\! Skipping zip else echo Removing update site line from packaged zip sed -i "s/\"update_url\"\:.*$//g" manifest.json zip -r ../$filename_zip * fi cd ../
Example usage
This is my build.sh
for the raytracer:
#!/bin/bash # version version=0.0.3 # file list files=( updates.xml manifest.json sebtracer-16.png sebtracer-48.png sebtracer-128.png ../sebtracer2.html ../sebtracer2.nmf ../sebtracer2_x86_32.nexe ../sebtracer2_x86_64.nexe ) modulename=SebTracer source /s/git/Code/chromeextensions/crx_build.sh
Leave a Reply