42 votes

golang intégrer fichier pour plus tard l'analyse de l'exécution d'utilisation

Je suis essentiellement essaie de marcher à travers un dossier de fichiers html. Je tiens à les intégrer dans le fichier binaire et être en mesure d'analyser la demande pour le modèle d'exécution fins. (Veuillez m'excuser si je n'ai pas le libellé correctement).

Des idées, des conseils, des astuces ou de meilleure façon de réaliser cela est très apprécié.

// Template Files
type TempFiles struct {
    Files map[string]string
}

// Loop through view files and load them
func LoadTempFiles() {
    t := new(TempFiles)

    // Load template files
    filepath.Walk("application/views", func(path string, info os.FileInfo, err error) error {
    if !info.IsDir() {
        content, _ := ioutil.ReadFile(path)
        t.Files[path] = string(content)
    }
    return nil
    })
}

func ViewTemp(w http.ResponseWriter, path string) {
    t := new(TempFiles)

    temp, err := template.New().Parse(t.Files[path])
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    } else {
        temp.Execute(w, nil)
    }
}

48voto

jimt Points 7028

Je le fais avec la plupart de mes web apps. J'utilise go-bindata de générer automatiquement Aller le code source de tous les fichiers que je veux intégrer et ensuite les compiler dans le binaire. Tout cela est fait automatiquement lors de la construction.

Un inconvénient est que le courant d'aller construire des outils n'offrent pas un moyen de les accrocher dans le processus de construction, donc j'utilise un Makefile pour ce but. Lorsque le makefile est invoqué, il s'exécute go-bindata pour générer les sources pour tous les fichiers nécessaires, puis effectue en général un code supplémentaire de génération de bits et des bobs (notamment, la création d'un Go fichier source qui répertorie tous les fichiers intégrés dans une carte.. Une Table des Matières si vous voulez). Il procède ensuite à compiler le programme.

Cela peut devenir un peu désordonné, mais vous n'êtes tous qu'une seule fois. Un autre inconvénient, c'est que l'utilisation d'un Makefile signifie que le logiciel n'est pas compatible avec l' go get commande. Mais puisque la plupart de mes applications web ne sont pas destinés à être partagés de toute façon, cela n'a pas été un problème jusqu'à présent.

Quand il s'agit de débogage/développement d'une telle application, il est une autre question qui se pose à partir de l'incorporation du contenu web statique: je ne peux pas juste modifier un code HTML ou CSS de fichiers et d'actualiser le navigateur pour voir ses effets. Je dois arrêter le serveur, de le reconstruire et de le redémarrer à chaque édition. Ce n'est évidemment pas l'idéal, je l'ai donc divisé le Makefile en debug et release mode. Le mode de libération fait ce que j'ai décrit ci-dessus. Le mode debug, cependant, volonté de ne pas intégrer les fichiers statiques. Il génère des fichiers source pour chacun d'eux, mais au lieu d'avoir entre eux contiennent de la réelle fichier de données, il contient un stub qui, tout simplement, charge les données depuis le système de fichiers.

Aussi loin que le code du serveur, il n'y a pas de différence dans le code généré. Il ne fait qu'appeler une fonction pour récupérer le contenu d'un fichier statique. Il ne se soucie pas de savoir si ce contenu est en fait intégré dans le système binaire, ou s'il est chargé à partir d'une source externe. Donc, les deux construire modes sont librement interchangeables.

Par exemple, la même fonction générée pour aller chercher un contenu de fichier statique en release et debug mode se présente comme suit:

Mode de diffusion:

func index_html() []byte {
    return []byte {
        ....
    }
}

Le mode Debug:

func index_html() []byte {
   data, err := ioutil.ReadFile("index.html")
   ...
   return data
}

L'interface dans les deux cas est identique. Cela permet une facile et sans souci de développement et de débogage.

8voto

GeertJohan Points 186

J'ai fait un package qui permet de commuter entre le débogage et la production plus facile. Il fournit également une http.Système de fichiers de la mise en œuvre, le rendant facile pour le serveur de fichiers. Et il y a plusieurs façons d'ajouter des fichiers dans le fichier binaire (générer aller au code, ou les ajouter en tant que zip). https://github.com/GeertJohan/go.rice

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X