2010-12-07 27 views
4

Je travaille avec App Engine et je pense utiliser l'extension LESS CSS dans mon prochain projet. Il n'y a pas de bonne bibliothèque CSS MOINS écrite en Python, donc j'ai continué avec l'original Ruby qui fonctionne très bien et hors de la boîte. Je souhaite que App Engine exécute lessc ./templates/css/style.less avant d'exécuter le serveur de développement et avant de télécharger les fichiers sur le cloud. Quelle est la meilleure façon d'automatiser cela? Je pense:App Engine: lancement d'un script lors de la mise à jour/exécution

#run.sh: 
lessc ./templates/css/style.less 
.gae/dev_appserver.py --use_sqlite . 

Et

#deploy.sh 
lessc ./templates/css/style.less 
.gae/appcfg.py update . 

Suis-je sur la bonne voie ou est-il une façon plus élégante de faire les choses, peut-être au niveau appcfg.py?

Merci.

+1

Je ne pense vraiment pas qu'il y ait un moyen plus facile. J'utilise une manière similaire mais pour js avec le compilateur google closure. – fredrik

+1

Vous pouvez également regarder http://sass-lang.com/ cela le fera en direct pendant votre développement. Vous avez donc un css déjà compact que vous pouvez télécharger. – fredrik

Répondre

2

Une option est d'utiliser la version javascript de Less et donc d'effectuer la conversion moins-à-css dans le navigateur. Téléchargez simplement votre fichier moins formaté (voir http://lesscss.org/ pour plus de détails).

Sinon, je fais la conversion (d'abord avec moins, maintenant je l'utilise SASS) dans un script de déploiement qui fait un certain nombre de choses

  • vérifie que mon contrôle de code source ne contient aucun fichier en cours vérifié (UNCOMMITED changements)
  • rejoint et minifies mon code .js (et court JSLint dessus) en un seul fichier
  • génère d'autres contenus (y compris estampillage la version de contrôle de code source comme numéro de version dans certains fichiers clés et en tant que paramètre sur certains fichiers pour éviter les problèmes de mise en cache) donc ma page principale extrait des scripts avec des URLs telles que "allmysour ce.js? v = 585" .. le fichier peut être statique, mais la valeur ajoutée params invalidation du cache de force
  • appels AppCfg pour effectuer le téléchargement et vérifie le code de retour
  • fait des appels vers le vrai site avec wget pour vérifier les fichiers générés précédemment sont effectivement retournés, en vérifiant qu'ils sont estampillés avec la version attendue
  • applique une autre balise de contrôle de code source pour dire que la version destinée a été déployée avec succès

Mon script accepte aussi un " -preview "dans quel cas il ne fait pas le téléchargement, mais signale le v Commentaires de contrôle de version pour ce qui a changé depuis le déploiement précédent.

[email protected] $ ./deploy -preview 
Deployment preview... 
Would deploy v596 to the production site (currently v593, previously v587) 
    594  Fix blah blah blah for X Y Z 
    595  New feature nah nah nah 
    596  Update help pages 

Ceci est très pratique comme un rappel de ce que je dois mettre dans les choses comme un changelog

Je prévois d'étendre aussi afin que je puisse, dans le cadre de mon contrôle de code source, ajoutez les code qui doit s'exécuter une seule fois lorsqu'il est déployé (par exemple, les modifications de schéma de base de données) et sachez qu'il sera automatiquement exécuté lorsque je déploierai une nouvelle version.

Essence du script ci-dessous que les gens ont demandé ... il ne montre pas mon "code de vérification, générer, rejoindre, et réduire" car c'est un autre script ...Je me rends compte que la question initiale posait des questions sur cette étape bien sûr :) mais vous pouvez voir où vous souhaitez ajouter l'appel pour générer CSS etc

#!/bin/sh 

function abort() { 
    echo 
    echo "ERROR: $1" 
    echo "$2" 
    exit 99 
} 

function warn() { 
    echo 
    echo "WARNING: $1" 
    echo "$2" 
} 

# Overrides the Gentoo eselect mechanism to force the python version the GAE scripts expect 
export EPYTHON=python2.5 

# names of tags used to label bzr versions  
CURR_DTAG=deployed 
PREV_DTAG=prevDeployed 

# command line options 
PREVIEW=0 
IGNORE_BZR=0 

# These next few vars are set to values to identify my site, insert your own values here... 
APPID=your_gae_appid_here 
ADMIN_EMAIL=your_admin_email_address_here 
SRCDIR=directory_to_deploy 
CHECK_URL=url_of_page_to_retrive_that_does_upload_initialisation 

for ARG; do 
    if [[ "$ARG" == "-preview" ]]; then 
     echo "Deployment preview..." 
     PREVIEW=1 
    fi 
    if [[ "$ARG" == "-force" ]]; then 
     echo "Ignoring the fact some files may not be committed to bzr..." 
     IGNORE_BZR=1 
    fi 
done 
echo 

# check bzr for uncommited changed  
BSTATUS=`bzr status` 
if [[ "$BSTATUS" != "" ]]; then 
    if [[ "$IGNORE_BZR" == "0" ]]; then 
     abort "There are uncommited changes - commit/revert/ignore all files before deploying" "$BSTATUS" 
    else 
     warn "There are uncommited changes" "$BSTATUS" 
    fi 
fi 

# get version of numbers of last deployed etc 
currver=`bzr log -l1 --line    | sed -e 's/: .*//'` 
lastver=`bzr log -rtag:${CURR_DTAG} --line | sed -e 's/: .*//'` 
prevver=`bzr log -rtag:${PREV_DTAG} --line | sed -e 's/: .*//'` 
lastlog=`bzr log -l 1 --line gae/changelog | sed -e 's/: .*//'` 

RELEASE_NOTES=`bzr log --short --forward -r $lastver..$currver \ 
    | perl -ne '$ver = $1 if /^ {0,4}(\d+) /; print " $ver $_" if ($ver and /^ {5,}\w/)' \ 
    | grep -v "^ *$lastver "` 

LOG_NOTES=`bzr log --short --forward -r $lastlog..$currver \ 
    | perl -ne '$ver = $1 if /^ {0,4}(\d+) /; print " $ver $_" if ($ver and /^ {5,}\w/)' \ 
    | grep -v "^ *$lastlog "` 

# Crude but old habit - BUGBUGBUG is a marker in the code for things to be fixed before deployment 
echo "Checking code for outstanding issues before deployment" 
BUGSTATUS=`grep BUGBUGBUG js/*js` 
if [[ "$BUGSTATUS" != "" ]]; then 
    if [[ "$IGNORE_BZR" == "0" ]]; then 
     abort "There are outstanding BUGBUGBUGs - fix them before deploying" "$BUGSTATUS" 
    else 
     warn "There are outstanding BUGBUGBUGs" "$BUGSTATUS" 
    fi 
fi 

echo 
echo "Deploy v$currver to the production site (currently v$lastver, previously v$prevver)" 
echo "$RELEASE_NOTES" 
echo 

if [[ "$currver" -gt "$lastlog" && "$lastver" -ne "$lastlog" ]]; then 
    echo "Changes since the changelog was last updated" 
    echo "$LOG_NOTES" 
    echo 
fi 

if [[ "$IGNORE_BZR" == "0" && $lastver -ge $currver ]]; then 
    abort "There don't appear to be any changes to deploy..." 
fi 

if [[ "$PREVIEW" == "1" ]]; then 
    exit 0 
fi 

$EPYTHON -c "import ssl" \ 
    || abort "$EPYTHON can't find ssl module for $EPYTHON - download it from pypi and install with the inbuilt setup.py" 

# REMOVED - call to my script that calls jslint, generates files and compresses JS etc 
# || abort "Generation of code failed" 

/opt/google_appengine/appcfg.py --email=$ADMIN_EMAIL -v -A $APPID update $SRCDIR \ 
    || abort "Appcfg failed - upload presumably incomplete" 

# move the tags to show we deployed properly 
bzr tag -r $lastver --force ${PREV_DTAG} 
bzr tag -r $currver --force ${CURR_DTAG} 

echo 
echo "Production site updated from v$lastver to v$currver (in turn from v$prevver)" 
echo 
echo "Now visiting $CHECK_URL to upload the source to the database" 

# new version doesn't seem to always be there (may be caching by the webserver etc) to be uploaded into the database.. try again just in case 
for cb in $RANDOM $RANDOM $RANDOM $RANDOM ; do 
    prodver=`wget $CHECK_URL?_cb=$cb -q -O - | perl -ne 'print $1 if /^\s*Rev #(\d+)\s*$/'` 
    if [[ "$currver" == "$prodver" ]]; then 
     echo "OK: New version $prodver successfully deployed" 
     exit 0 
    fi 
    echo "Retrying the upload of source to the database" 
    sleep 5 
done 
abort "The new source doesn't seem to be loading into the database" "Try 'wget $CHECK_URL?_cb=$RANDOM -q -O -'" 

Il est pas particulièrement grand ou intelligent, mais il automatise la tâche de téléchargement

+0

Tim, votre script est-il disponible quelque part pour vous inspirer? – Emilien

+0

Ajout du script dans la réponse ci-dessus ... j'espère que ça aide ... crier sinon :) – Tim