天天看點

VisualStudio 指令行編譯 build 通過 rebuild 不通過

在使用指令行編譯項目,發現使用 build 可以編譯通過,但是通過 rebuild 編譯提示找不到項目,明明在對應的檔案夾存在項目輸出的 dll 檔案,但是會提示找不到

在指令行編譯的 build 和 rebuild 的不同在于使用 build 會用上次編譯的内容,如果沒有檔案更改,那麼這個項目不會重新編譯。同時會從緩存拿到項目依賴順序,擷取上次編譯的項目資訊。而 rebuild 會先執行 clean 清理,會清理緩存重新建立項目依賴順序

而如果 build 能通過而 rebuild 不能通過,此時請嘗試清理整個項目倉庫的 ​

​bin​

​​ 和 ​

​obj​

​ 檔案夾。在使用 git 管理的項目可以使用下面指令快速清理

git clean -xdf      

在執行上面指令之前請先送出本地檔案

清理完成之後再次使用 build 指令,關于 msbuild 指令行請看 MSBuild 常用參數

如果清理完成發現通過 build 指令不通過,注意這裡的不通過不是因為 nuget 沒還原而沒通過,那麼證明現在的代碼是因為依賴上次編譯的内容。此時可以清理完成在 VisualStudio 打開,看錯誤清單内容

如果清理完成發現通過 build 指令能通過,同時用 rebuild 指令如果沒有添加 /m 指令也就是并行編譯沒有問題,而添加了 /m 指令并行重新編譯就不通過,提示某些項目的 dll 找不到,那麼可能是引用項目不對

如果使用的項目是舊項目格式,不是 sdk style 格式的 csproj 檔案,那麼在引用項目時需要添加項目的 Guid 值。要求引用的 Guid 和項目聲明的相同,和 sln 裡面使用的相同

在項目檔案裡面,可以用記事本工具打開,可以找到 ProjectGuid 屬性

<ProjectGuid>{7478AF9C-E871-48D0-A61E-EA5331654412}</ProjectGuid>      

而在其他項目引用就需要這樣寫

<ProjectReference Include="..\lindexi\BitStamp.csproj">
      <Project>{a4181b72-65a2-4625-a355-7dea615baa53}</Project>
      <Name>BitStamp</Name>
    </ProjectReference>      

如上面這樣寫,在多線程編譯會關聯找不到 BitStamp 項目,原因是引用的項目的 Guid 和項目的不相同,這樣就無法在編譯時找到引用順序,也就是項目沒有按照順序編譯也找不到對應項目

解決方法是通過在引用右擊添加引用,将項目引用取消勾選,點選确定。再右擊添加引用,重新引用項目就可以

通過這一步可以在 git 等工具看到 csproj 被修改,也就是引用的 Project 屬性被修改。如果這樣也不成,可能是 sln 裡面使用的值不對。解決方法是重新建立一個解決方案,将項目添加到解決方案,删除之前的解決方案

注意重新建立解決方案不要在原因解決方案移除項目,如果在原有解決方案移除項目将會在被移除的項目從所有引用的項目移除

我搭建了自己的部落格 https://blog.lindexi.com/ 歡迎大家通路,裡面有很多新的部落格。

如果在部落格看到有任何不懂的,歡迎交流,我搭建了 dotnet 職業技術學院 歡迎大家加入