2017-02-28 48 views
1

我有一個雨傘應用程序。我看到了Dialyzer的價值,我正試着開始使用它。我已經相當遠了,但我有一個問題,我無法解決Ecto。Ecto變更集和透析器錯誤

這是一個處理認證的小型應用程序。我可以用最簡單的例子來修剪它。

使用Elixir 1.4.2和Dialyxir 0.4.0。在問題

代碼

defmodule Auth.Account do 
    use Ecto.Schema 
    import Ecto.Changeset 

    schema "auth_accounts" do 
    field :email, :string 
    field :password_hash, :string 
    field :password, :string, virtual: true 

    timestamps() 
    end 

    def build(params \\ %{}) do 
    changeset(%__MODULE__{}, params) 
    end 

    def changeset(account, params \\ %{}) do 
    account 
    |> cast(params, ~w(email password)) 
    end 
end 

相關的錯誤輸出

lib/auth/account.ex:13: Function build/0 has no local return 
lib/auth/account.ex:13: Function build/1 has no local return 
lib/auth/account.ex:14: The call 'Elixir.Auth.Account':changeset(#{'__meta__':=#{'__struct__':='Elixir.Ecto.Schema.Metadata', 'context':='nil', 'source':={'nil',<<_:104>>}, 'state':='built'}, '__struct__':='Elixir.Auth.Account', 'email':='nil', 'id':='nil', 'inserted_at':='nil', 'password':='nil', 'password_hash':='nil', 'updated_at':='nil'},[email protected]::any()) 
    will never return since it differs in the 1st argument from the success typing arguments: ({map(),map()} | #{'__struct__':=atom(), 'action'=>'delete' | 'insert' | 'nil' | 'replace' | 'update', 'changes'=>#{atom()=>_}, 'constraints'=>[#{'constraint':=binary(), 'field':=atom(), 'match':='exact' | 'suffix', 'message':={_,_}, 'type':='unique'}], 'data'=>'nil' | #{'__struct__':=atom()}, 'empty_values'=>_, 'errors'=>[{atom(),{_,_}}], 'filters'=>#{atom()=>_}, 'params'=>'nil' | #{binary()=>_}, 'prepare'=>[fun((map()) -> map())], 'repo'=>atom(), 'required'=>[atom()], 'types'=>'nil' | #{atom()=>atom() | {'array',_} | {'embed',map()} | {'in',_} | {'map',_}}, 'valid?'=>boolean(), 'validations'=>[{atom(),_}]},'invalid' | #{'__struct__'=>none(), atom() | binary()=>_}) 

它出現的問題是圍繞着build功能的使用%__MODULE__{}。看到這個相關Stack Overflow Topic

但是,我只是無法弄清楚有效的替代語法。

+0

這是否修復了警告? 'def build(params \\%{})do'? – Dogbert

+0

不幸的不是。我更新了上面的代碼,以免混淆其他代碼。但我只是重新測試來驗證。問題依然存在。確保PLT重建。 –

+0

Scratch,如果我複製粘貼你的確切代碼在一個新的混合包中,我無法在本地重現。你用什麼版本的Ecto?如果您將該模塊複製到全新的混合包中,您是否能夠重現此項目? (FWIW我不認爲這個錯誤與你連接的其他問題有關。) – Dogbert

回答

1

Dogbert促使我深入挖掘,無法重現它。

我在ecto〜> 2.0。 mix.lock文件讓我在2.0.5。在mix deps.unlock --allmix deps.clean --allmix deps.get之後,我被提升到ecto 2.1.3。

圖書館升級後,透析器不再抱怨這一點。所以我的修復是升級到更新的ecto版本。