2017-04-14 1 views
0

J'ai l'application Phoenix (je l'ai créée avec l'indicateur --api) qui a des données supplémentaires requises pour traiter les demandes que je stocke dans priv/data/filters.csv.Lecture de fichiers dans Phoenix en mode production

Donc, cela fonctionne très bien en mode dev, je peux lire ce fichier comme: File.stream!("priv/data/filters.csv"), mais une fois l'application est livrée en utilisant mix edeliver update ce fichier n'est plus accessible.

Je peux voir ce dossier dans le répertoire de construction, mais après que l'application est livrée, il n'y a pas de tel dossier priv. Je ne suis pas sûr pourquoi il n'est pas copié pour livrer le dossier.

Qu'est-ce que je fais mal? Ai-je besoin de copier ces fichiers après le processus de livraison? Où puis-je stocker mes fichiers que je dois utiliser en mode prod?

+0

Quel est le contenu de 'rel/config.exs'? – mudasobwa

+2

Essayez 'File.stream! (Path.join (: code.priv_dir (: mon_app)," data/filters.csv "))'. – Dogbert

+0

Un moyen rapide de tester cela est d'ouvrir une remote_console à votre instance de production. Vous pouvez ensuite taper 'pwd' dans iex pour voir où commence votre chemin relatif. Ensuite, essayez l'appel à ': code.priv_dir (: my_app)' et très le chemin absolu. –

Répondre

3

Vous devez utiliser :code.priv_dir/1 pour obtenir le chemin absolu vers le répertoire priv de votre application lors de l'exécution. Cela fonctionnera avec les versions d'Erlang créées par ex. Distillerie:

File.stream!(Path.join(:code.priv_dir(:my_app), "data/filters.csv")) 

Pour moi, après avoir fait MIX_ENV=prod mix release, le fichier est copié dans priv/foo_build/prod/lib/my_app/priv/foo.

+0

Que Dieu vous bénisse, ça marche! Et maintenant je sais comment ça fonctionne. – BitOfUniverse

0

Vous devriez vérifier votre configuration dans le lib/YOUR_APP/endpoint.ex. Par défaut, Plug.Static blanc liste les fichiers qui sont servis. Essayez d'ajouter vos fichiers à la liste only: ~w(...).

+0

Oui, mais je n'ai pas vu les fichiers statiques habituels non plus. C'est parce que j'ai mal compris la structure du fichier, et je devais le faire pour le dossier 'priv' dans le dossier' deilver_path/lib/app_version/', pas dans le' deliver_path' lui-même. – BitOfUniverse

0

J'ai eu un problème similaire et a réussi à résoudre à l'aide Application.app_dir(my_app, "priv")