2016-06-21 39 views
0

這可能有點複雜,但我會盡我所能。我有一系列使用Browserify的API模塊,其中一些還調用其他模塊。它們幾乎相互交織,這會使更新變得困難。例如,假設我有五個模塊:A,B,C,D和E. A需要B和C,B需要C,D和E.如果我需要A的一些更新正在改變,我可以對它進行版本化,但是我需要更新B和C中的require語句。由於B現在使用了不同版本的A,我還需要版本B,這意味着更改C,D和E中的require語句。因此,一個模塊中的單個更改意味着我必須恢復其他所有內容。更新一個CommonJS模塊,而不必觸摸它所需的每個模塊

我應該注意,主要原因是我必須保留舊版本。這些都是小型的微型網站,一個網站可能會用A - E構建,而下一個網站可能會用A' - E'構建,但我仍然需要能夠獨立構建。儘管對A'的更改可能對它暴露的API沒有任何影響,但我不希望返回並重新測試每個修改過的單個項目。

我想過要有一個單獨的每個項目文件可能需要,然後它需要該項目的所有版本化模塊,但這是一個循環依賴項。

如果重要,我使用Gulp和Browserify來構建最終的JS文件。

回答

0

我發現的東西,會做的伎倆:aliasify

我改變了我的要求語句require('Api/ModuleA')然後在aliasify配置我映射Api/ModuleA./libs/Api/ModuleA-1.0和它拿起我想每一次的版本,它需要模塊A

0

我使用了一種類似於Java類路徑的機制。我創建了一個自定義模塊解析器,並將單獨的模塊根用於單獨的項目。 Ther也是常用文件的文件夾。模塊解析器首先搜索項目文件夾中的模塊,如果在通用文件夾中找不到它,則搜索該模塊。通過這種方式,您可以爲特定項目提供模塊A的專門實現。不知道它是否適合你的情況。它就像是用文件系統文件夾而不是配置文件來支持配置的不同之處。

A是一個只有少數依賴關係的模塊,並且被許多模塊引用。他們通常稱這種模塊「成熟」。這些成熟的模塊應該經過充分測試,並且公共接口不應該經常變化,因爲每個依賴模塊都需要更新。所以你可以嘗試在不破壞API的情況下進行更改,可能會創建一個帶有版本名稱的新模塊,以及使用新模塊提供舊API的模塊封裝器。新組件可以使用新模塊,舊組件不會受到影響。

由於某種原因,它們使用多個數字來版本化軟件。在最簡單的情況下,有兩個數字:主要和次要版本。次要版本可隨每個版本而改變,主要版本在公共API改變時增加。只有在主要版本發生變化時,才需要更新所有依賴此組件的組件。 (當然有時在執行一個次要版本時會出現一些錯誤,這些錯誤會破壞一些相關的組件,但那不是通常的情況)。如果您更改A的公共API,您也需要更改BC,但不能更改其他公用API。 A會有一個主要的版本更改,B和C會有一個未成年人。其餘的保持不變。這需要一個更復雜的模塊解析器,它可以根據其主要版本解析最新的模塊。但這就是npm無論如何。

+0

我想過使用回退,但不同的版本不一定*棄用較舊的版本。同樣的原因,它並不總是一個API的變化。例如,Logger可能需要爲某些項目添加額外的日誌記錄源,或者Data模塊可能需要以不同方式組織。外部API沒有變化,在版本化意義上,它不是「更新」或「更好」,它只是不同而已。 – mherzig

+0

我認爲一個日誌模塊不應該依賴它的來源或目標。它可以提供一個可配置的界面,而應用程序的主要條目(每個項目都不同)可以提供日誌記錄源或目標列表。 –

相關問題