2015-10-06 14 views
11

Ho un progetto di elisir con una versione definita. Come posso accedere a questo all'interno dell'applicazione in esecuzione.Versione del progetto di accesso nell'applicazione elixir

in mix.exs

def project do 
    [app: :my_app, 
    version: "0.0.1"] 
    end 

Mi piacerebbe essere l'accesso questo numero di versione dell'applicazione in modo da posso aggiungerlo al messaggio restituito. Io alla ricerca di qualcosa in hash env come la seguente

__ENV__.version 
# => 0.0.1 

risposta

10

Ecco un approccio simile per recuperare la stringa di versione. Essa si basa anche sul modulo :application, ma è forse un po 'più semplice:

{:ok, vsn} = :application.get_key(:my_app, :vsn) 
List.to_string(vsn) 
+0

Questo è un modo migliore. Personalmente, userò ancora la pipeline di parsing 'charlist |> string |> intero', ma questo è decisamente più pulito che usare 'which_applications'. –

+0

Sì, buon punto. La soluzione di Chris è ovviamente più lunga perché fa un passo in più per convertire la stringa in una tupla di interi. Solo per la stampa, la stringa semplice dovrebbe tuttavia essere sufficiente. Potresti combinare le due risposte per ottenere la tupla se ne hai bisogno. –

6

ho trovato la versione interna del :application.which_applications, ma richiede un po 'di analisi:

defmodule AppHelper do 
    @spec app_version(atom) :: {integer, integer, integer} 
    def app_version(target_app) do 
    :application.which_applications 
    |> Enum.filter(fn({app, _, _}) -> 
        app == target_app 
        end) 
    |> get_app_vsn 
    end 

    # I use a sensible fallback when we can't find the app, 
    # you could omit the first signature and just crash when the app DNE. 
    defp get_app_vsn([]), do: {0,0,0} 
    defp get_app_vsn([{_app, _desc, vsn}]) do 
    [maj, min, rev] = vsn 
         |> List.to_string 
         |> String.split(".") 
         |> Enum.map(&String.to_integer/1) 
    {maj, min, rev} 
    end 
end 

E poi per l'uso:

iex(1)> AppHelper.app_version(:logger) 
{1, 0, 5} 

Come sempre, probabilmente c'è un modo migliore.

+0

Buone applausi risposta. Anche se è un peccato se questo è il modo migliore per farlo. –

+1

Questa è la guida che Jose Valim ha dato a qualcuno solo poche settimane fa. Cioè, usa: application.which_application. https://groups.google.com/d/msg/elixir-lang-talk/qlX4hJKZvC8/pCZBqM1zCQAJ –

3

Che dire:

YourApp.Mixfile.project[:version] 
+0

Solo FYI, questo è un commento automatico inserito automaticamente durante la revisione: in realtà non riflette questo caso, il che è sfortunato. La mia opinione personale: una risposta è uno "statementment", idealmente supportato da riferimenti autorevoli, esempi e/o esperienze. Sebbene non ci siano punti interrogativi qui, "Che dire di ..." è una domanda. Se questa è davvero una risposta, ti suggerisco di modificarla per sembrare una di quelle, e offrire una breve spiegazione che possa educare i lettori collegando la soluzione offerta al problema. – Mogsdad

20

Mix.Project stesso fornisce l'accesso a tutte le parole chiave del progetto definite nel mix.exs utilizzando il suo config/0 (api doc) funzione. Per l'accesso sintetico potrebbe essere avvolto in una funzione:

@version Mix.Project.config[:version] 
def version(), do: @version 
+2

Assicurarsi che questo venga valutato al momento della compilazione come mostrato nell'esempio. Altrimenti non funzionerà in produzione perché 'module Mix.Project non è disponibile'. – Johannes

Problemi correlati