5

我有一個packages.config文件簽入源代碼管理。這指定了我想要的Nuget依賴關係的確切版本。我們有我們自己的NuGet存儲庫。我們正在自己創建這些NuGet包。如何在TeamCity中構建時從Nuget包中複製js文件?

<packages> 
    <package id="Dome" version="1.0.0.19" targetFramework="net45" /> 
    <package id="Dome.Dojo" version="1.0.0.19" targetFramework="net45" /> 
</packages> 

這些包有當您添加NuGet包這在Visual Studio中的引用複製到腳本項目文件夾一些JavaScript文件。

我不想檢查這些JS文件中的源代碼管理,我只想檢查packages.config文件。

當我的項目在Team City中生成時(或者在新建結賬後在Visual Studio中生成時),它不會從NuGet包複製JS文件。有解釋類似的問題在這裏一個問題:

NuGet package files not being copied to project content during build

但是,在這個問題的答案,我不工作的解決方案;該解決方案使用ReInstall,這是有問題的,因爲它可以自動升級packages.config文件中的版本(例如,如果將依賴項指定爲> =)。

這樣做的關鍵是我希望能夠從我的源代碼管理中檢出修訂版本,並根據正確的依賴關係構建該版本,並且我想使用NuGet的良好打包功能。所以,我不希望任何「在構建過程中自動更新到最新版本。」

對於NuGet(http://nuget.codeplex.com/workitem/2094)存在關於不恢復內容文件的NuGet文件的問題。它被標記爲按設計關閉。

考慮到這是多麼有效,但在我看來(但我不是100%肯定),對於程序集NuGet有不同的行爲 - 它不會將它們複製到項目中,而是引用它們來自包文件夾中的位置。這讓我覺得,NuGet包中的js文件應該是,參考文件類似於如何引用dll。

有沒有辦法構建一個NuGet包,以便它引用JS作爲項目中的鏈接(與VS如何將現有文件添加爲鏈接一樣)?這會解決我的問題嗎?

如果沒有,那麼我會採取由傑夫·漢德利給出的建議時,請關閉打勾的NuGet發行2094上面提到的:

你可以選擇是創建一個新的控制檯可執行 引用的NuGet。核心,你可以建立一個補充包 復原爲自己使用,複製包內容到 項目。

寫我自己的命令行工具來複制內容看起來好像我在這裏推水上山 - 我在做一些根本性錯誤?

回答

1

這裏的根本問題是JavaScript的項目的Visual Studio的支持比較差和JavaScript缺乏的內置模塊加載器。

對於C#,安裝程序包時,它會將.csproj文件中的引用添加到磁盤上的程序集。當你構建時,MSBuild知道要複製引用到bin目錄的東西。既然你沒有檢查你的bin目錄,這一切都很好。

對於JavaScript而言,不幸的是,構建系統並沒有成熟,NuGet也沒有明確的指導方針。理想情況下(IMO),Visual Studio不會直接從源目錄運行網站。相反,當你創建它時,會將JavaScript文件,CSS和HTML文件複製到它們將從其執行的bin目錄中。在調試時,它會將這些映射回原始的JavaScript或TypeScript文件(因此,如果您進行了更改,則不是臨時文件)。如果發生這種情況,那麼現在就有了一個定義明確的構建步驟,並且可能是JavaScript文件的一個明確定義的標記(而不僅僅是「內容」)。這意味着NuGet可以利用定義明確的MSBuild標籤,包裝作者可以利用NuGet功能做正確的事情。

不幸的是,以上都不是真的。 JavaScript文件是就地運行的,如果您將它們複製到bin上,Visual Studio會做錯誤的事情,並且從調試器進行編輯會編輯暫時文件(而不是原始文件)。因此,NuGet沒有明確的放置文件的位置,因此它將決定權交給軟件包作者。軟件包作者知道,普通用戶只是直接從源代碼運行(無需構建步驟),因此他們將文件轉儲到源文件夾中,並在其中進行版本控制。

如果你來自像C#這樣的現代化生態系統,那麼有人花時間思考這些事情,整個系統是非常陳舊的。

可以創建一個MSBuild任務,在構建之前,它會遍歷所有包,查找內容並將該內容複製到所需的位置。這不會非常困難,雖然需要一些工作。

此外,程序包作者可以包含一個構建任務,在其包中執行此操作,以便在構建之前將其所有內容複製到本地。不幸的是,如果只有一些軟件包作者這樣做,那麼最終會出現奇怪的碎片,其中一些軟件包需要提交到版本控制,而另一些則不需要。

0

當一個包被安裝到一個項目,在的NuGet實際上執行這些操作,

  1. 從源代碼下載包文件;
  2. 將軟件包安裝到所謂的packages文件夾中,默認爲$(SolutionDir)\ p​​ackages;
  3. 安裝軟件包到項目,它由加引用的DLL,複製內容文件到項目目錄等

當一個包被恢復的,只有前兩個步驟被執行。 Nuget包恢復不會觸及項目。這就是爲什麼你的項目中的js文件不會被「恢復」。

現在唯一的解決方案是檢查項目中的js文件。

1

如果你是包的所有者,那麼你可以使用我創建的nuget包來在包中有一個名爲「Linked」的文件夾,並且有一個簡單的Install.ps1和Uninstall.ps1(一個襯裏)將nuget包的鏈接文件夾中的每個文件添加到項目中。

https://github.com/baseclass/Contrib.Nuget#baseclasscontribnugetlinked

我沒有試出來的出版物對待如何鏈接文件,該問題正在調試的項目,如JavaScript文件將在目錄中丟失。

如果你使用git作爲源代碼控制,你可以試試我的nuget包,它會忽略所有的nuget內容文件,並在構建之前自動恢復它們。

步步例如在我的博客:http://www.baseclass.ch/blog/Lists/Beitraege/Post.aspx?ID=9&mobile=0

相關問題