2016-09-18 41 views
0

當運行一個新的設置與碼頭工人撰寫,我們看到編譯此錯誤:編譯錯誤/ token.ex:Phoenix.Socket .__結構__/0是未定義

== Compilation error on file lib/phoenix/token.ex == 
** (CompileError) lib/phoenix/token.ex:144: Phoenix.Socket.__struct__/0 is undefined, cannot expand struct Phoenix.Socket 
    (stdlib) lists.erl:1354: :lists.mapfoldl/3 
could not compile dependency :phoenix, "mix compile" failed. You can recompile this dependency with "mix deps.compile phoenix", update it with "mix deps.update phoenix" or clean it with "mix deps.clean phoenix" 

我不知道爲什麼。研究/deps/phoenix/lib/phoenix/token.ex/socket.ex並沒有說明爲什麼會發生這種情況。

這是與Elixir 1.3.2和Phoenix 1.2.0。

+1

您提到您正在Docker中運行phoenix應用程序。你是否有機會使用通過Docker裝載在開發中使用的相同應用程序文件夾(如'docker -v「$ PWD」:/ app ...')?如果是這樣的話,Phoenix可能會使用'./ build'文件夾中的預構建工件,這些工件是在不同的平臺上編譯的。 – potz

+0

@PiguiguarFaga我們使用的是Docker Compose,因此我們的'docker-compose.yml'確實使用了相同的應用程序文件夾。有可能你是對的,最終用戶在主機上進行普通編譯,然後嘗試通過Docker進行使用。 –

回答

0

由於您確認您的docker-compose.yml已將docker容器中的應用程序文件夾掛載,因此我將詳細闡述我是如何解決在類似場景中遇到的一些編譯問題的。這並沒有解決你所問的具體錯誤,但它可以作爲找出更適合你的問題的答案的指導。

我在Mac OS/X上開發並使用docker基於debian的圖像來構建我的Phoenix Framework項目。我通過docker -v "$PWD":/app -w /app potz/elixir-build mix phoenix.serverpotz/elixir-build只是一個自定義的圖像,我用一些預先安裝的東西)在容器中安裝應用程序文件夾。這提出了一個問題,因爲當Phoenix在容器內運行時,它會看到帶有預編譯工件的_build目錄並嘗試使用該目錄,但當然這會拋出各種奇怪的編譯錯誤消息,因爲它們是在不同的平臺(OS /X)。此外,依賴關係保存在./deps文件夾中,並且這些文件也在OS/X上預編譯。

我對該問題的解決方案是指示docker爲構建工件和依賴項使用不同的文件夾,在仍使用相同的應用程序源文件的情況下有效分離這兩個環境。

def project do 
    [app: :my_app, 
    version: "0.0.1", 
    elixir: "~> 1.3", 
    elixirc_paths: elixirc_paths(Mix.env), 
    compilers: [:phoenix, :gettext] ++ Mix.compilers, 
    build_embedded: Mix.env == :prod, 
    build_path: System.get_env("BUILD_PATH") || "_build", # Allows different path for builds 
    deps_path: System.get_env("DEPS_PATH") || "deps",  # Allows different path for deps 
    start_permanent: Mix.env == :prod, 
    aliases: aliases(), 
    deps: deps()] 
end 

然後在泊塢窗運行時,我提供這兩個值的環境變量,例如:

# /build and /deps can be folders inside the container, 
# or mounted volumes, whatever makes sense to your specific setup 
docker run -v "$PWD":/app -w /app -e BUILD_PATH=/build -e DEPS_PATH=/deps potz/elixir-build mix phoenix.server 
爲了做到這一點,我需要允許 mix.exsbuild_pathdeps_path設置由環境變量覆蓋

當然,我有一個自定義外殼腳本,以避免始終記住這個龐大的命令行,但我猜你可以適應你的Docker組合設置。你只需要確保你在容器中創建了那些文件夾,或者記住在這些路徑上掛載兩個額外的卷,無論什麼更有意義。

我希望這會有所幫助。

相關問題