1. 程式人生 > >解決使用MSBuild編譯專案沒有拷貝間接引用的dll問題

解決使用MSBuild編譯專案沒有拷貝間接引用的dll問題

Description:使用命令列編譯專案時,只會拷貝直接引用的二進位制dll到專案輸出資料夾,不會拷貝間接引用的。例如同一解決方案下有A,B兩個專案,A專案引用log4net,B專案引用A專案。使用VS編譯時會把log4net.dll拷貝到B專案的bin目錄,但是簡單的使用MSBuild b.csproj /p:Configuration:Release並不會拷貝log4net.

Analysis:從最表面入手,沒有拷貝就讓他拷貝。檢視MSDN,得知有Copy task可以用,實際上msbuild所有的步驟都定義在csproj檔案和MSBuild .Targets 檔案裡邊了。找到最簡單暴力的方法,拷貝。

1.先確定從哪裡拷貝什麼,很顯然我們需要的是A專案bin/(debug|release)目錄下的dll檔案,有個疑問,這個dll版本會是最新的嗎?答:一定是,因為使用MSBuild編譯時所有間接引用的專案都會根據指令重新生成。

直接在當前夏木的csproj檔案的Project配置節下邊新增一個<ItemGroup>配置節,設定我們需要查詢的檔案。$(Configuration)是指當前編譯時使用/p傳進來的引數,msbuild會自動替換掉,如使用MSBuild b.csproj /p:Configuration:Release並就會替換成Release。

2.什麼時候如何拷貝。這個也很簡單。在csproj檔案末尾新增Name屬性為AfterBuild的Target 配置節。因為這個專案時webApplication專案,所以直接拷貝到bin目錄即可。

<Target Name="AfterBuild"> <Copy SourceFiles="@(Dlls)" DestinationFolder="bin\"/> </Target> </Project>

思考:

這個方法方便可靠嗎?

肯定不方便,建立每個可執行專案(exe,webApplication)都需要修改一下配置檔案。此方法還沒有在website上驗證。

也不太可靠,如果出現下邊的情況會是怎樣呢?

這種複製具有不確定性,即大家都不確定最終是哪個版本覆蓋哪個版本。實際上這個在我之前寫程式碼的時候就發現了,一直不知道如何處理,兩個版本改動不大還好說,如果改動大了呢?我當時的做法是使用

Dll Redirection,把低版本重定向高版本。但是這完全是自作自受的做法,在自己可控範圍內為什麼不用同一個版本的dll呢,如果這樣不就可靠了嗎?其實有可能還是不可靠,因為還有很多種情況沒有檢驗過,這個方法只限於解決當前問題。常常見到別人和我從同一個出發點開始思考,往往提出了更全面,更前瞻性的解決方案時就覺得很沒勁、很自責。想來和經驗與性格都有關,有待改進!

不可靠你還拿出來?

完全是記錄自己解決問題的思路。其實這種思路並不正確,我總是喜歡做一些模稜兩可的事情,表面上看似解決問題了,實際則不然,一直再改進,但起色不大,求指點。

這個是最優方法嗎?

不是,如果你開啟MSBuild .Targets 檔案就發現有很多流程和這個問題相關,很多地方都能解決這個問題,DUDU老大找到一篇資料《resolving binary references in msbuild》就提出了至少2種方法,顯示一個簡單暴力的方法,接著給出了一個比較perfect的解決方案。

參考:

相關推薦

解決使用MSBuild編譯專案沒有拷貝間接引用dll問題

Description:使用命令列編譯專案時,只會拷貝直接引用的二進位制dll到專案輸出資料夾,不會拷貝間接引用的。例如同一解決方案下有A,B兩個專案,A專案引用log4net,B專案引用A專案。使用VS編譯時會把log4net.dll拷貝到B專案的bin目錄,但是簡單的使用MSBuild b.csproj

程式碼修改之後MSbuild編譯不出最新的dll解決方法

問題: 使用jenkins釋出的時候,開發不斷反饋自己修改的檔案使用jenkins沒有釋出到測試環境。經過查證發現使用MSBUILD編譯的時出現修改的檔案編譯出的日期不是最新日期,但是使用VS編譯就不會出現此問題。   解決方案: 在Project裡面新增元素:新增InitialTarget

解決maven非resources資料夾下的配置檔案編譯時不拷貝問題

用hibernate反向生成實體類時,報錯:org.hibernate.MappingNotFoundException: resource:**.hbm.xml not found 原因: maven web工程中,編譯時預設只將resources下的資原始檔拷貝到ta

專案maven依賴成功,但編譯一直報錯:引用專案的類路徑找不到

使用IDE:Intellij Idea 框架:spring-boot 專案結構:兩個子專案之間的引用,A和B均為C專案的子專案,A需要依賴B。問題探索的過程(浪費了a lot of time,時間就是金錢啊,心疼~~~,希望看到這篇文章的小夥伴少走彎路 ) 1.A專案在依

VS編譯間接引用DLL不一定輸出

如果A引用B,B引用C,那麼A對C就是間接引用,一般的編譯A時會輸出B的DLL,而因為B對C有引用,所以也會輸出C的DLL。但是實際編譯時發現,並不一定都會輸出C的DLL。後面不斷的追查原因,最終發現是與B對C引用時程式碼的呼叫有關。如果B對C的呼叫都是常量的方式,比如C中都

記錄解決 Spring Boot 專案繼承依賴導致編譯失敗問題

問題背景,公司一個使用 Spring Boot 的 Mutil 專案,根據 Spring Boot 官方文件配置好 Parent 繼承 spring-boot-starter-parent POM 的時候可以正常編譯執行,但是正式上線時,需要切換到繼承公司

Maven編譯找不到外部引用包的解決

錯誤出現場景有些jar包是通過maven依賴引入,但有些包是自己的或者maven倉庫找不到這樣的jar,就通過buildpath加入到專案中,但是maven編譯的時候,找不到這些包,導致編譯失敗,如圖:解決外部包在如圖位置:那麼解決方式就是在編譯時指定這些外部包的位置pom.

解決在Eclipse新建web專案沒有自動生成web.xml和在新建servlet的時候自動生成web.xml配置

一、在Eclipse新建web專案沒有自動生成web.xml解決辦法 方法一:在Eclipse新建web專案的時候重要引數上打勾 1、file–new-Dynamic Web Project 2、next下一步 3、next下一步 4、關鍵:這裡一定要打勾,預設是沒

vs2010和VS2012中,新建專案沒有看到解決方案(已解決

不知怎麼弄的,突然新建專案沒有了解決方案,想重灌太浪費時間了,網上查也沒有找到問這個問題的人,後來一想,是不是前幾天初始vs時把引數給初始了,於是,在【工具】-【選項】-【專案和解決方案】,把右邊的對勾都選上,懶得試哪

AndroidStudio升級後編譯專案出現Aapt2Exception異常的問題解決方案

問題描述AndroidStudio升級後,開啟舊專案沒問題,但是新建專案編譯會報錯:Errorcom.android.tools.aapt2.Aapt2Exception AAPT2 error che

Maven專案沒有Project Facets的解決方法

經常在eclipse中匯入web專案時,出現轉不了專案型別的問題,匯入後就 是一個java專案,有過很多次經歷,今天也有同事遇到類似問題,就把這個解決方法記下來吧,免得以後再到處去搜索。 解決步驟: 1、進入專案目錄,可看到.project檔案,開啟。 2、找到&l

eclipse無法build project 編譯專案或者類的解決方法

1. 點選選單上的project,先clean 2. 刪除build path裡所有引用的lib,然後重新匯入。3. 右鍵點選專案,build project 我的問題就是這樣解決。 傳說的其它方法,我沒試驗成功,如下:

delphi 10.1編譯專案的時候出現MSBuildToolsPath is not specified for the ToolsVersion解決辦法

今天在使用delphi 10.1編譯專案的時候出現MSBuildToolsPath is not specified for the ToolsVersion "14.0" defined at

springboot專案上有個紅叉,且ecplise沒有自動編譯專案,執行提示“錯誤: 找不到或無法載入主類”

近期在做springboot專案,發現springboot專案上有個紅叉但找不到哪個類報錯,ecplise沒有把專案自動編譯,執行還提示“錯誤: 找不到或無法載入主類”,進入工作空間“專案\target\classes”,發現專案java類根本沒有編譯,嘗試各種方式發現均

web專案釋出到tomcat中編譯沒有classes檔案的原因

通常專案編譯釋出到tomcat中後會在WEB-INF下生成classes檔案,這裡麵包含的是編譯後的Java原始碼檔案!那麼在什麼情況下編譯後classes檔案沒有出現在WEB-INF下呢? 在工作空間中每個專案裡都有一個.settings檔案,這個檔案下包含的是專案釋出編

使用Ant編譯專案,舊版SDK用apkbuilder打包,新版SDK沒有apkbuilder工具,用sdklib.jar打包apk

1、舊版SDK目錄,使用apkbuilder工具打包apk 如果你的SDK目錄是舊的,還有apkbuilder.exe工具的話,打包成apk的配置豐富如下: <!-- 打包成未簽名的apk,使用apkbuilder命令組合classes.dex,res.zip和

解決ADT Eclipse專案的Preference中,Java Compiler下沒有Annotation Processing

很多做安卓開發的跟我一樣,用的IDE可能都是從谷歌安卓官網上下載的ADT Bundle的Eclipse吧,確實這樣很方便,解壓出來就直接能用。但是前段時間遇到一個問題,本來打算用一下ButterKnife這個注入框架,但不光是把jar包扔進專案libs資料夾中就完了,還要求在專案右鍵的preference裡

【加快cocos2d-x編譯速度】cocos2d-x編譯專案時避免拷貝資料夾和庫

http://codingnow.cn/cocos2d-x/928.html 本文參考自子龍山人的部落格,跟他的方法也有少許的不同,自己用著舒心才是最重要的。cocos2d-x的版本更新太快了,本文使用的是最新的cocos2d-x 2.0.4版本,IDE是vs2010

個人解決的一個IDEA專案中不能引用pom檔案中新增的依賴問題

在某一次的開發過程中,發現在pom檔案中已經新增好了依賴以及版本號等,可是程式碼中並不能引用這些依賴。最終還是找到了解決辦法:在IDEA中找到MAVEN外掛(file->setting->搜尋框中輸入mave

Eclipse中的Android專案編譯沒有生成R檔案的兩種原因

筆者在用Eclipse寫Android專案,時常發生R檔案錯誤。 對此筆者總結了兩種原因:一種是res目錄下的檔案有Eclipse檢查不出的錯誤,但不能通過編譯,因此沒有生成R檔案。還有一種情況是已經