本申請涉及計算機技術領域,具體涉及應用程序開發(fā)技術領域,尤其涉及應用構建方法和裝置。
背景技術:
軟件的構建在軟件工程的整個過程中占有很大的比重,貫穿軟件開發(fā)、測試、發(fā)布、部署、升級的整個過程。目前,絕大多數(shù)軟件項目都需要構建(或者編譯)的支持,以取得更高的研發(fā)效率和更優(yōu)越的運行時性能。軟件構建包含不定數(shù)量、不定順序的步驟。
然而,目前業(yè)界的構建工具在面對復雜軟件項目的構建時,存在以下一些不足:(1)構建操作是基于文件的,即,每一個構建操作都需要讀寫磁盤文件,并需要手動設置操作目錄,嚴重影響構建速度;(2)增量構建大多以任務為單位,這可能導致針對未改動文件有許多不必要的重復構建行為,再次影響了速度和效率;(3)構建任務大都基于容易枚舉的文件,無法處理不可枚舉的文件;(4)不能定制構建的流程,更不能定制并行的構建流程。綜上所述,目前業(yè)界的常用構建工具不能完美地勝任越來越復雜的軟件項目構建。
技術實現(xiàn)要素:
本申請的目的在于提出一種改進的應用構建方法和裝置,來解決以上背景技術部分提到的技術問題。
第一方面,本申請?zhí)峁┝艘环N應用構建方法,所述方法包括:獲取用于構建應用的輸入文件集合、用于構建應用的構建操作集合以及所述構建操作集合中各個構建操作之間的執(zhí)行順序信息;按照預定義的文件存儲路徑與所述構建操作集合中各個入口構建操作的對應關系,將所述輸入文件集合中的每個輸入文件劃分到與該輸入文件的文件存儲路徑對應的入口構建操作所對應的輸入文件子集合中,其中,由每個入口構建操作所對應的輸入文件子集合中的各個輸入文件的文件存儲路徑和文件內容形成的文件對象是該入口構建操作的輸入?yún)?shù);對所述構建操作集合中的每個構建操作,執(zhí)行以下第一構建步驟:在該構建操作沒有前置構建操作或前置構建操作都已經完成的情況下,對該構建操作的輸入?yún)?shù)中各個文件對象的文件內容執(zhí)行該構建操作,并在該構建操作有后置構建操作的情況下將執(zhí)行該構建操作后所得到的輸出參數(shù)中的各個文件對象添加到該構建操作的各個后置構建操作的輸入?yún)?shù)中;將各個出口構建操作執(zhí)行完所述第一構建步驟后所得到的輸出參數(shù)中的各個文件對象的文件內容以文件形式存儲到磁盤,其中,所存儲到磁盤的各個文件是構建所得到的應用的文件。
第二方面,本申請?zhí)峁┝艘环N應用構建裝置,所述裝置包括:獲取單元,配置用于獲取用于構建應用的輸入文件集合、用于構建應用的構建操作集合以及所述構建操作集合中各個構建操作之間的執(zhí)行順序信息;劃分單元,配置用于按照預定義的文件存儲路徑與所述構建操作集合中各個入口構建操作的對應關系,將所述輸入文件集合中的每個輸入文件劃分到與該輸入文件的文件存儲路徑對應的入口構建操作所對應的輸入文件子集合中,其中,由每個入口構建操作所對應的輸入文件子集合中的各個輸入文件的文件存儲路徑和文件內容形成的文件對象是該入口構建操作的輸入?yún)?shù);執(zhí)行單元,配置用于對所述構建操作集合中的每個構建操作,執(zhí)行以下第一構建步驟:在該構建操作沒有前置構建操作或前置構建操作都已經完成的情況下,對該構建操作的輸入?yún)?shù)中各個文件對象的文件內容執(zhí)行該構建操作,并在該構建操作有后置構建操作的情況下將執(zhí)行該構建操作后所得到的輸出參數(shù)中的各個文件對象添加到該構建操作的各個后置構建操作的輸入?yún)?shù)中;存儲單元,配置用于將各個出口構建操作執(zhí)行完所述第一構建步驟后所得到的輸出參數(shù)中的各個文件對象的文件內容以文件形式存儲到磁盤,其中,所存儲到磁盤的各個文件是構建所得到的應用的文件。
本申請?zhí)峁┑膽脴嫿ǚ椒ê脱b置,通過獲取用于構建應用的輸入文件集合、用于構建應用的構建操作集合以及所述構建操作集合中各個構建操作之間的執(zhí)行順序信息;然后,按照預定義的文件存儲路徑與構建操作集合中各個入口構建操作的對應關系,將輸入文件集合中的每個輸入文件劃分到與該輸入文件的文件存儲路徑對應的入口構建操作所對應的輸入文件子集合中;接著,對構建操作集合中的每個構建操作,執(zhí)行第一構建步驟;最后,將各個出口構建操作執(zhí)行完第一構建步驟后所得到的輸出參數(shù)中的各個文件對象的文件內容以文件形式存儲到磁盤。實現(xiàn)了定制應用構建的流程,提高了應用構建的靈活性;并且在整個構建的過程中只讀寫一次磁盤中的文件,從而提高了構建速度。
附圖說明
通過閱讀參照以下附圖所作的對非限制性實施例所作的詳細描述,本申請的其它特征、目的和優(yōu)點將會變得更明顯:
圖1是根據(jù)本申請的應用構建方法的一個實施例的流程圖;
圖2是根據(jù)本申請的應用構建方法的一個應用場景的示意圖;
圖3a-圖3c是根據(jù)本申請的應用構建方法的又一個實施例的流程圖;
圖4是根據(jù)本申請的應用構建裝置的一個實施例的結構示意圖;
圖5是適于用來實現(xiàn)本申請實施例的電子設備的計算機系統(tǒng)的結構示意圖。
具體實施方式
下面結合附圖和實施例對本申請作進一步的詳細說明??梢岳斫獾氖?,此處所描述的具體實施例僅僅用于解釋相關發(fā)明,而非對該發(fā)明的限定。另外還需要說明的是,為了便于描述,附圖中僅示出了與有關發(fā)明相關的部分。
需要說明的是,在不沖突的情況下,本申請中的實施例及實施例中的特征可以相互組合。下面將參考附圖并結合實施例來詳細說明本申請。
圖1示出了根據(jù)本申請的應用構建方法的一個實施例的流程100。所述的應用構建方法,包括以下步驟:
步驟101,獲取用于構建應用的輸入文件集合、用于構建應用的構建操作集合以及構建操作集合中各個構建操作之間的執(zhí)行順序信息。
在本實施例中,應用構建方法運行于其上的電子設備可以本地或者遠程地從與上述電子設備網絡連接的其他電子設備獲取用于構建應用的輸入文件集合、用于構建應用的構建操作集合以及構建操作集合中各個構建操作之間的執(zhí)行順序信息。
在本實施例中,構建操作用于表征對該構建操作的輸入?yún)?shù)進行的具體操作。構建操作可以通過具體的程序代碼、程序代碼中封裝好的函數(shù)或者封裝好的應用程序接口(API,Application Program Interface)來實現(xiàn)對該構建操作的輸入?yún)?shù)進行的具體操作并返回輸出參數(shù)。具體采用何種形式在本申請中不做具體限定。
在本實施例中,各個構建操作之間的執(zhí)行順序信息用于表征各個構建操作之間的執(zhí)行先后關系。
在本實施例的一些可選的實現(xiàn)方式中,構建操作集合中執(zhí)行順序相鄰的兩個構建操作,將執(zhí)行順序在前的劃分為前置構建操作,將執(zhí)行順序在后的劃分為后置構建操作;即,對執(zhí)行順序相鄰的兩個構建操作,執(zhí)行順序在前的構建操作是執(zhí)行順序在后的構建操作的前置構建操作,執(zhí)行順序在后的構建操作是執(zhí)行順序在前的構建操作的后置構建操作。構建操作可以沒有前置構建操作,對于沒有前置構建操作的構建操作劃分為入口構建操作;構建操作也可以沒有后置構建操作,對于沒有后置構建操作的構建操作劃分為出口構建操作。構建操作也可以有至少一個前置構建操作或者至少一個后置構建操作。構建操作集合中的各個構建操作之間可以相同也可以不相同。
在本實施例的一些可選的實現(xiàn)方式中,構建操作可以包括以下至少一項:去除注釋、合并、代碼混淆、壓縮、加密、解密。
在本實施例的一些可選的實現(xiàn)方式中,用于構建應用的輸入文件集合可以是位于上述電子設備本地或者與上述電子設備網絡連接的其他電子設備中的指定文件夾及其子文件夾中的所有文件。
在本實施例的一些可選的實現(xiàn)方式中,用于構建應用的輸入文件集合也可以是位于上述電子設備本地或者與上述電子設備網絡連接的其他電子設備中的多個指定文件夾中的多個指定文件名的文件。
在本實施例的一些可選的實現(xiàn)方式中,上述電子設備可以是從存儲在上述電子設備本地或者與上述電子設備網絡連接的其他電子設備中的構建操作定義文件中獲取用于構建應用的構建操作集合以及構建操作集合中各個構建操作之間的執(zhí)行順序信息。作為示例,可以從指定的記錄有用于構建應用的構建操作集合以及構建操作集合中各個構建操作之間的執(zhí)行順序信息的Javascript(一種直譯式腳本語言,是一種動態(tài)類型、弱類型、基于原型的語言,內置支持類型。它的解釋器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用于客戶端的腳本語言,最早是在網頁上使用,用來給網頁增加動態(tài)功能)文件中讀取??梢岳斫獾氖牵瑯嫿ú僮鞫x文件的內容可以由用戶根據(jù)所構建的應用不同而編寫不同的構建操作和各個構建操作之間的執(zhí)行順序信息,從而可以定制應用構建的流程。
步驟102,按照預定義的文件存儲路徑與構建操作集合中各個入口構建操作的對應關系,將輸入文件集合中的每個輸入文件劃分到與該輸入文件的文件存儲路徑對應的入口構建操作所對應的輸入文件子集合中。
在本實施例中,基于步驟101中得到的輸入文件集合以及構建操作集合中的各個入口構建操作,上述電子設備可以按照預定義的文件存儲路徑與構建操作集合中各個入口構建操作的對應關系,將輸入文件集合中的每個輸入文件劃分到與該輸入文件的文件存儲路徑對應的入口構建操作所對應的輸入文件子集合中。其中,由每個入口構建操作所對應的輸入文件子集合中的各個輸入文件的文件存儲路徑和文件內容形成的文件對象是該入口構建操作的輸入?yún)?shù)。
在本實施例的一些可選的實現(xiàn)方式中,可以按照輸入文件的文件擴展名來定義文件存儲路徑與構建操作集合中各個入口構建操作的對應關系。例如,位于“D:\filesforconstruction\”文件夾中的所有擴展名為“.png”、“.jpg”或者“.gif”的文件對應“復制”入口構建操作;位于“D:\filesforconstruction\”文件夾中的所有擴展名為“.js”的文件對應“Babel(下一代的JavaScript語法編譯器)”入口構建操作。
在本實施例的一些可選的實現(xiàn)方式中,也可以按照輸入文件所在的文件夾來定義文件存儲路徑與構建操作集合中各個入口構建操作的對應關系。例如,位于“D:\filesforconstruction\img\”文件夾中的所有文件對應“復制”入口構建操作;位于“D:\filesforconstruction\src\”文件夾中的所有文件,對應“Babel(下一代的JavaScript語法編譯器)”入口構建操作。
在本實施例的一些可選的實現(xiàn)方式中,還可以按照組合輸入文件所在的文件夾和輸入文件的擴展名來定義文件存儲路徑與構建操作集合中各個入口構建操作的對應關系。例如,位于“D:\filesforconstruction\img\”文件夾中的所有擴展名為“.png”、“.jpg”或者“.gif”的文件對應“復制”入口構建操作;位于“D:\filesforconstruction\src\”文件夾中的所有擴展名為“.js”的文件對應“Babel(下一代的JavaScript語法編譯器)”入口構建操作;位于“D:\filesforconstruction\css\”文件夾中的所有擴展名為“.less”的文件對應“Less(將.less文件預編譯為.css文件)”入口構建操作;位于“D:\filesforconstruction\css\”文件夾中的所有擴展名為“.sass”的文件對應“Sass(將.sass文件預編譯為.css文件)”入口構建操作;位于“D:\filesforconstruction\css\”文件夾中的所有擴展名為“.styl”的文件對應“Stylus(將.styl文件預編譯為.css文件)”入口構建操作。
步驟103,對構建操作集合中的每個構建操作,執(zhí)行第一構建步驟。
在本實施例中,上述電子設備可以在步驟102中為每個入口構建操作都設置了輸入?yún)?shù)后,對構建操作集合中的每個構建操作,執(zhí)行以下第一構建步驟:在該構建操作沒有前置構建操作或前置構建操作都已經完成的情況下,對該構建操作的輸入?yún)?shù)中各個文件對象的文件內容執(zhí)行該構建操作,并在該構建操作有后置構建操作的情況下將執(zhí)行該構建操作后所得到的輸出參數(shù)中的各個文件對象添加到該構建操作的各個后置構建操作的輸入?yún)?shù)中。在對各個構建操作執(zhí)行第一構建步驟的過程中,對各個入口構建操作,在步驟102中已經為各個入口構建操作設置了輸入?yún)?shù),并以文件對象的形式存在于內存中;對于每個非入口構建操作,該非入口構建操作的輸入?yún)?shù)是該非入口構建操作的各個前置構建參數(shù)的輸出參數(shù)。因此每個構建操作執(zhí)行第一步驟的過程都沒有涉及到讀寫磁盤操作,均在內存中進行操作,從而可以提高構建速度。
在本實施例的一些可選的實現(xiàn)方式中,上述電子設備可以為每個構建操作設置前置構建操作已完成數(shù)目,并在步驟103執(zhí)行之前,將每個構建操作的前置構建操作已完成數(shù)目設置為0。在步驟102執(zhí)行的過程中,當任何一個構建操作完成的時候,可以給該構建操作的各個后置構建操作發(fā)送該構建操作已完成的消息。同時對任何一個收到前置構建操作已完成消息的構建操作,將該構建操作的前置構建操作已完成數(shù)目做加一操作。這樣,上述電子設備可以在該構建操作的前置構建操作已完成數(shù)目達到該構建操作的前置構建操作數(shù)目的情況下確認該構建操作的前置構建操作都已經完成。
需要說明的是,在本申請中,各個構建操作之間不存在循環(huán)執(zhí)行順序,即,本申請中對輸入文件集合執(zhí)行構建操作的過程中,不會出現(xiàn)死循環(huán)。以構建操作集合中每個構建操作為節(jié)點,以各個構建操作之間的執(zhí)行順序為節(jié)點間的有向連接線而形成拓撲結構圖,該拓撲結構圖為有向無環(huán)圖(DAG,Directed Acyclic Graph)。
步驟104,將各個出口構建操作執(zhí)行完第一構建步驟后所得到的輸出參數(shù)中的各個文件對象的文件內容以文件形式存儲到磁盤。
在本實施例中,上述電子設備可以將各個出口構建操作執(zhí)行完第一構建步驟后所得到的輸出參數(shù)中的各個文件對象的文件內容以文件形式存儲到磁盤。這里,所存儲到磁盤的各個文件是構建所得到的應用的文件。
在本實施例的一些可選的實現(xiàn)方式中,步驟102也可以如下進行:
首先,上述電子設備可以按照預定義的文件存儲路徑與所述構建操作集合中各個入口構建操作的對應關系,對所述輸入文件集合中的每個輸入文件,查找與該輸入文件的文件存儲路徑對應的入口構建操作。
接著,響應于找到與該輸入文件的文件存儲路徑對應的入口構建操作,則將該輸入文件劃分到與該輸入文件的文件存儲路徑對應的入口構建操作所對應的輸入文件子集合中;響應于未找到與該輸入文件的文件存儲路徑對應的入口構建操作,則將該輸入文件劃分到剩余文件子集合中。
基于上述的步驟102的可選實現(xiàn)方式,步驟104也可以如下進行:
首先,將各個出口構建操作執(zhí)行完第一構建步驟后所得到的輸出參數(shù)中的各個文件對象的文件內容以文件形式存儲到磁盤,其中,所存儲到磁盤的各個文件是構建所得到的應用的文件的第一子集;
然后,將上述步驟102的可選實現(xiàn)方式中剩余文件集合中的各個文件的文件內容以文件形式存儲到磁盤,其中,所存儲到磁盤的各個文件是構建所得到的應用的文件的第二子集。
基于上述步驟102和步驟104的可選實現(xiàn)方式,上述電子設備可以實現(xiàn)將預定義的文件存儲路徑與構建操作集合中各個入口構建操作的對應關系中無法枚舉的輸入文件劃分到統(tǒng)一的剩余文件子集合中,而該剩余文件子集合中的文件是不需要任何操作,只需要直接另存為構建所得到的應用中的文件即可。
繼續(xù)參見圖2,圖2是根據(jù)本實施例的應用構建方法的應用場景的一個示意圖。在圖2的應用場景中,用于構建應用的輸入文件集合按照預定義的文件存儲路徑與構建操作集合中各個入口構建操作的對應關系,被劃分為與入口構建操作A1對應的輸入文件子集合、與入口構建操作B1對應的輸入文件子集合和與入口構建操作C1對應的輸入文件子集合,其中,由與入口構建操作A1對應的輸入文件子集合中的各個輸入文件的文件存儲路徑和文件內容形成的文件對象是入口構建操作A1的輸入?yún)?shù),由與入口構建操作B1對應的輸入文件子集合中的各個輸入文件的文件存儲路徑和文件內容形成的文件對象是入口構建操作B1的輸入?yún)?shù),由與入口構建操作C1對應的輸入文件子集合中的各個輸入文件的文件存儲路徑和文件內容形成的文件對象是入口構建操作C1的輸入?yún)?shù)。然后,上述電子設備可以基于構建操作集合中的各個構建操作以及各個構建操作之間的執(zhí)行順序信息執(zhí)行構建過程。這里,構建流程整體的執(zhí)行順序可以是不同的。例如,執(zhí)行順序可以是“A1→A2→A3→B1→B2→B4→C1→C2→B3→D→C3→E”,還可以是“A1→A2→B1→B2→B4→B3→C1→C2→C3→E→A3→D”。最后,出口構建操作D和出口構建操作E的輸出參數(shù)中的各個文件對象的文件內容會被寫入磁盤,并且所寫入磁盤的文件就是構建所得到的應用的各個文件。
本申請的上述實施例提供的方法通過將應用構建的過程靈活定義,并可以隨時修改,增加了應用構建的靈活性;同時整個構建過程對每個輸入文件只涉及到一次磁盤讀操作,提高了應用構建的速度。
進一步參考圖3a-圖3c,其示出了應用構建方法的又一個實施例的流程300。如圖3a所示,該應用構建方法的流程300,包括以下步驟:
步驟301,獲取用于構建應用的輸入文件集合、用于構建應用的構建操作集合以及構建操作集合中各個構建操作之間的執(zhí)行順序信息。
步驟302,按照預定義的文件存儲路徑與構建操作集合中各個入口構建操作的對應關系,將輸入文件集合中的每個輸入文件劃分到與該輸入文件的文件存儲路徑對應的入口構建操作所對應的輸入文件子集合中。
在本實施例中,步驟301和步驟302的具體操作分別與圖1對應的實施例100中的步驟101和步驟102的具體操作基本相同,在此不再贅述。
步驟303,對構建操作集合中的每個構建操作,執(zhí)行第一構建步驟。
在本實施例中,上述電子設備可以在步驟302中為每個入口構建操作都設置了輸入?yún)?shù)后,對構建操作集合中的每個構建操作,執(zhí)行第一構建步驟,這里第一構建步驟可以包括子步驟3031-3039,如圖3b所示。
步驟3031,判斷該構建操作是否沒有前置構建操作或前置構建操作都已經完成,如果是轉到步驟3032。
步驟3032,判斷該構建操作是批處理文件構建操作還是單個文件構建操作,如果是批處理文件構建操作,則轉到步驟3033,如果是單個文件構建操作,則轉到步驟3037。
步驟3033,對該構建操作的輸入?yún)?shù)中各個文件對象的文件內容執(zhí)行該構建操作。
步驟3034,判斷該構建操作是否有后置構建操作,如果是,轉到步驟3035。
步驟3035,將執(zhí)行該構建操作后所得到的輸出參數(shù)中的各個文件對象添加到該構建操作的各個后置構建操作的輸入?yún)?shù)中。
步驟3036,遞歸刪除緩存中該構建操作以及該構建操作的每個后置構建操作對應的緩存區(qū)域中以該構建操作的輸出參數(shù)中的每個文件對象的文件存儲路徑為索引的文件內容。
步驟3037,對該構建操作的輸入?yún)?shù)中的每個文件對象,執(zhí)行第二構建步驟。
在本實施例中,第二構建步驟包括子步驟30371、30372、30373、30374和30375,如圖3c所示。
步驟30371,判斷該構建操作對應的緩存區(qū)域中是否存在以該文件對象的文件存儲路徑為索引的文件內容,如果存在,則轉到步驟30372,如果不存在,則轉到步驟30373。
步驟30372,將由該文件對象的文件存儲路徑和該構建操作對應的緩存區(qū)域中以該文件對象的文件存儲路徑為索引的文件內容形成的文件對象添加到該構建操作的輸出參數(shù)中。
步驟30373,對該文件對象的文件內容執(zhí)行該構建操作。
步驟30374,將執(zhí)行后所得到的文件內容以該文件對象的文件存儲路徑為索引寫入該構建操作對應的緩存區(qū)域中。
步驟30375,將由該文件對象的文件存儲路徑和該構建操作對應的緩存區(qū)域中以該文件對象的文件存儲路徑為索引的文件內容形成的文件對象添加到該構建操作的輸出參數(shù)中。
步驟3038,判斷該構建操作是否有后置構建操作,如果是,轉到步驟3039。
步驟3039,將對該構建操作執(zhí)行完第二構建步驟后所得到的輸出參數(shù)中的各個文件對象添加到該構建操作的各個后置構建操作的輸入?yún)?shù)中。
步驟304,將各個出口構建操作執(zhí)行完第一構建步驟后所得到的輸出參數(shù)中的各個文件對象的文件內容以文件形式存儲到磁盤。
在本實施例中,可以在步驟304后,轉到步驟305、步驟309或步驟311中的任何一個,以實現(xiàn)對輸入文件集合的監(jiān)聽。
步驟305,監(jiān)聽輸入文件集合中是否有輸入文件的文件內容發(fā)生變化,如果是,轉到步驟306。
步驟306,獲取輸入文件集合中文件內容發(fā)生變化的各個輸入文件,并組成變化輸入文件集合。
步驟307,將該構建操作對應的緩存區(qū)域中以變化輸入文件集合中每個變化輸入文件的文件存儲路徑為索引的文件內容刪除。
步驟308,對變化輸入文件中的每個變化輸入文件,按照預定義的文件存儲路徑與各個入口構建操作的對應關系,將該變化輸入文件重新劃分到與該變化輸入文件的文件存儲路徑對應的入口構建操作所對應的輸入文件子集合中,然后轉到步驟303進行重新構建。
步驟309,監(jiān)聽輸入文件集合中每個輸入文件所在的文件夾中是否有文件增加,如果是,轉到步驟310。
步驟310,按照預定義的文件存儲路徑與各個入口構建操作的對應關系,將所增加的每個輸入文件劃分到與該所增加的輸入文件的文件存儲路徑對應的入口構建操作所對應的輸入文件子集合中,然后轉到步驟303進行重新構建。
步驟311,監(jiān)聽輸入文件集合中是否有輸入文件被刪除,如果是,轉到步驟312。
步驟312,對每個被刪除的輸入文件,將該被刪除的輸入文件從該被刪除的輸入文件上次被劃分到的入口構建操作的輸入文件子集合中刪除。
步驟313,對構建操作集合中的每個構建操作,將該構建操作對應的緩存區(qū)域中以每個被刪除的輸入文件的文件存儲路徑為索引的文件內容刪除,然后轉到步驟303進行重新構建。
在本實施例的一些可選的實現(xiàn)方式中,上述第一構建步驟中的子步驟3031之前還可以包括如下步驟:
解析該構建操作的輸入?yún)?shù)中每個文件對象的文件內容,并提取該文件對象所依賴的文件的文件存儲路徑,分別用該文件對象的文件存儲路徑和所提取的該文件對象所依賴的文件的文件存儲路徑更新文件依賴關系表中的文件存儲路徑和所依賴文件存儲路徑。
基于上述第一構建步驟的可選實現(xiàn)方式,步驟306也可以如下方式進行:
首先,獲取輸入文件集合中文件內容發(fā)生變化的各個輸入文件,組成第一變化輸入文件集合;
然后,對第一變化輸入文件集合中的每個變化輸入文件,在上述文件依賴關系表中查詢與該變化輸入文件的文件存儲路徑相同的所依賴文件存儲路徑,用與查詢到的所依賴文件存儲路徑對應的各個文件存儲路徑所指示的各個輸入文件組成依賴于該變化輸入文件的依賴輸入文件子集合;
接著,合并上述第一變化輸入文件集合中的各個變化輸入文件的依賴輸入文件子集合,得到第二變化輸入文件集合;
最后,組合上述第一變化輸入文件集合和上述第二變化輸入文件集合得到變化輸入文件集合。
基于上述第一構建步驟和步驟306的可選實現(xiàn)方式,上述電子設備可以記錄文件之間的依賴關系,并在增量構建的過程中,對文件內容發(fā)生變化的文件和依賴于文件內容發(fā)生變化的文件的文件進行重新構建。
從圖3中可以看出,與圖1對應的實施例相比,本實施例中的應用構建方法的流程300多出了對輸入文件集合進行監(jiān)聽的步驟305、309和311。由此,本實施例描述的方案可以在用于構建的輸入文件集合中有文件增加、刪除或者有文件的文件內容發(fā)生變化的時候,僅對增加、刪除或文件內容發(fā)生變化的部分進行構建,沒有變化的部分不會重復構建,從而實現(xiàn)增量構建,減少了構建成本,提高了開發(fā)效率。
進一步參考圖4,作為對上述各圖所示方法的實現(xiàn),本申請?zhí)峁┝艘环N應用構建裝置的一個實施例,該裝置實施例與圖1所示的方法實施例相對應,該裝置具體可以應用于各種電子設備中。
如圖4所示,本實施例所述的應用構建裝置400包括:獲取單元401、劃分單元402、執(zhí)行單元403和存儲單元404。其中,獲取單元401,配置用于獲取用于構建應用的輸入文件集合、用于構建應用的構建操作集合以及上述構建操作集合中各個構建操作之間的執(zhí)行順序信息;劃分單元402,配置用于按照預定義的文件存儲路徑與上述構建操作集合中各個入口構建操作的對應關系,將上述輸入文件集合中的每個輸入文件劃分到與該輸入文件的文件存儲路徑對應的入口構建操作所對應的輸入文件子集合中,其中,由每個入口構建操作所對應的輸入文件子集合中的各個輸入文件的文件存儲路徑和文件內容形成的文件對象是該入口構建操作的輸入?yún)?shù);執(zhí)行單元403,配置用于對上述構建操作集合中的每個構建操作,執(zhí)行以下第一構建步驟:在該構建操作沒有前置構建操作或前置構建操作都已經完成的情況下,對該構建操作的輸入?yún)?shù)中各個文件對象的文件內容執(zhí)行該構建操作,并在該構建操作有后置構建操作的情況下將執(zhí)行該構建操作后所得到的輸出參數(shù)中的各個文件對象添加到該構建操作的各個后置構建操作的輸入?yún)?shù)中;存儲單元404,配置用于將各個出口構建操作執(zhí)行完上述第一構建步驟后所得到的輸出參數(shù)中的各個文件對象的文件內容以文件形式存儲到磁盤,其中,所存儲到磁盤的各個文件是構建所得到的應用的文件。
在本實施例中,應用構建的裝置400的獲取單元401、劃分單元402、執(zhí)行單元403和存儲單元404的具體處理及其所帶來的技術效果可分別參考圖1對應實施例中步驟101、步驟102、步驟103和步驟104的相關說明,在此不再贅述。
本實施例的一些可選的實現(xiàn)方式中,上述構建操作集合中執(zhí)行順序相鄰的兩個構建操作根據(jù)執(zhí)行順序可以劃分為前置構建操作或后置構建操作,沒有前置構建操作的構建操作可以劃分為入口構建操作,沒有后置構建操作的構建操作可以劃分為出口構建操作。
本實施例的一些可選的實現(xiàn)方式中,上述構建操作可以包括批處理文件構建操作和單個文件構建操作;以及上述執(zhí)行單元403可以進一步配置用于:判斷該構建操作是批處理文件構建操作還是單個文件構建操作;如果該構建操作為批處理文件構建操作,則:對該構建操作的輸入?yún)?shù)中各個文件對象的文件內容執(zhí)行該構建操作,并在該構建操作有后置構建操作的情況下將執(zhí)行該構建操作后所得到的輸出參數(shù)中的各個文件對象添加到該構建操作的各個后置構建操作的輸入?yún)?shù)中,并遞歸刪除緩存中該構建操作以及該構建操作的每個后置構建操作對應的緩存區(qū)域中以該構建操作的輸出參數(shù)中的每個文件對象的文件存儲路徑為索引的文件內容;如果該構建操作為單個文件構建操作,則:對該構建操作的輸入?yún)?shù)中的每個文件對象,執(zhí)行以下第二構建步驟:判斷該構建操作對應的緩存區(qū)域中是否存在以該文件對象的文件存儲路徑為索引的文件內容;如果存在,則將由該文件對象的文件存儲路徑和該構建操作對應的緩存區(qū)域中以該文件對象的文件存儲路徑為索引的文件內容形成的文件對象添加到該構建操作的輸出參數(shù)中;如果不存在,則對該文件對象的文件內容執(zhí)行該構建操作,并將執(zhí)行后所得到的文件內容以該文件對象的文件存儲路徑為索引寫入該構建操作對應的緩存區(qū)域中,將由該文件對象的文件存儲路徑和該構建操作對應的緩存區(qū)域中以該文件對象的文件存儲路徑為索引的文件內容形成的文件對象添加到該構建操作的輸出參數(shù)中;在該構建操作有后置構建操作的情況下將對該構建操作執(zhí)行完上述第二構建步驟后所得到的輸出參數(shù)中的各個文件對象添加到該構建操作的各個后置構建操作的輸入?yún)?shù)中。執(zhí)行單元403的具體處理及其所帶來的技術效果可參考圖3a和圖3b對應實施例中步驟303以及步驟303的子步驟3031到3039的相關說明,在此不再贅述。
本實施例的一些可選的實現(xiàn)方式中,上述應用構建裝置400還可以包括:第一監(jiān)聽單元405,配置用于監(jiān)聽上述輸入文件集合中是否有輸入文件的文件內容發(fā)生變化;第一重構單元406,配置用于如果監(jiān)聽到上述輸入文件集合中有輸入文件的文件內容發(fā)生變化,則獲取上述輸入文件集合中文件內容發(fā)生變化的各個輸入文件,并組成變化輸入文件集合;對上述構建操作集合中每個構建操作,將該構建操作對應的緩存區(qū)域中以上述變化輸入文件集合中每個變化輸入文件的文件存儲路徑為索引的文件內容刪除;對上述變化輸入文件集合中的每個變化輸入文件,按照預定義的文件存儲路徑與上述構建操作集合中各個入口構建操作的對應關系,將該變化輸入文件重新劃分到與該變化輸入文件的文件存儲路徑對應的入口構建操作所對應的輸入文件子集合中;對上述構建操作集合中的每個構建操作,執(zhí)行上述第一構建步驟;將各個出口構建操作執(zhí)行完上述第一構建步驟后所得到的輸出參數(shù)中的各個文件對象的文件內容以文件形式存儲到磁盤。第一監(jiān)聽單元405和第一重構單元406的具體處理及其所帶來的技術效果可分別參考圖3a對應實施例中步驟305以及步驟306-步驟308、步驟304和步驟304的相關說明,在此不再贅述。
本實施例的一些可選的實現(xiàn)方式中,上述應用構建裝置400還可以包括:第二監(jiān)聽單元407,配置用于監(jiān)聽上述輸入文件集合中是否有輸入文件被刪除;第二重構單元408,配置用于如果監(jiān)聽到上述輸入文件集合中有輸入文件被刪除,則對每個上述被刪除的輸入文件,將該被刪除的輸入文件從該被刪除的輸入文件上次被劃分到的入口構建操作的輸入文件子集合中刪除;對上述構建操作集合中的每個構建操作,將該構建操作對應的緩存區(qū)域中以每個被刪除的輸入文件的文件存儲路徑為索引的文件內容刪除;對上述構建操作集合中的每個構建操作,執(zhí)行上述第一構建步驟;將各個出口構建操作執(zhí)行完上述第一構建步驟后所得到的輸出參數(shù)中的各個文件對象的文件內容以文件形式存儲到磁盤。第二監(jiān)聽單元407和第二重構單元408的具體處理及其所帶來的技術效果可分別參考圖3a對應實施例中步驟311以及步驟312、步驟313、步驟303和步驟304的相關說明,在此不再贅述。
本實施例的一些可選的實現(xiàn)方式中,上述應用構建裝置400還可以包括:第三監(jiān)聽單元409,配置用于監(jiān)聽上述輸入文件集合中每個輸入文件所在的文件夾中是否有文件增加;第三重構單元410,配置用于如果是,則按照預定義的文件存儲路徑與各個入口構建操作的對應關系,將所增加的每個輸入文件劃分到與該所增加的輸入文件的文件存儲路徑對應的入口構建操作所對應的輸入文件子集合中;對上述構建操作集合中的每個構建操作,執(zhí)行上述第一構建步驟;將各個出口構建操作執(zhí)行完上述第一構建步驟后所得到的輸出參數(shù)中的各個文件對象的文件內容以文件形式存儲到磁盤。第三監(jiān)聽單元409和第三重構單元410的具體處理及其所帶來的技術效果可分別參考圖3a對應實施例中步驟309以及步驟310、步驟303和步驟304的相關說明,在此不再贅述。
本實施例的一些可選的實現(xiàn)方式中,上述劃分單元402可以包括:查找模塊4021,配置用于按照預定義的文件存儲路徑與上述構建操作集合中各個入口構建操作的對應關系,對上述輸入文件集合中的每個輸入文件,查找與該輸入文件的文件存儲路徑對應的入口構建操作;第一劃分模塊4022,配置用于響應于找到與該輸入文件的文件存儲路徑對應的入口構建操作,則將該輸入文件劃分到與該輸入文件的文件存儲路徑對應的入口構建操作所對應的輸入文件子集合中;第二劃分模塊4023,配置用于響應于未找到與該輸入文件的文件存儲路徑對應的入口構建操作,則將該輸入文件劃分到剩余文件子集合中;以及上述存儲單元404可以包括:第一存儲模塊4041,配置用于將各個出口構建操作執(zhí)行完上述第一構建步驟后所得到的輸出參數(shù)中的各個文件對象的文件內容以文件形式存儲到磁盤,其中,所存儲到磁盤的各個文件是構建所得到的應用的文件的第一子集;第二存儲模塊4042,配置用于將上述剩余文件集合中的各個文件的文件內容以文件形式存儲到磁盤,其中,所存儲到磁盤的各個文件是構建所得到的應用的文件的第二子集。查找模塊4021、第一劃分模塊4022、第二劃分模塊4023、第一存儲模塊4041以及第二存儲模塊4042的具體處理及其所帶來的技術效果可參考圖1對應實施例中關于步驟102和步驟104的可選實現(xiàn)方式的相關說明,在此不再贅述。
本實施例的一些可選的實現(xiàn)方式中,上述在該構建操作沒有前置構建操作或前置構建操作都已經完成的情況下,對該構建操作的輸入?yún)?shù)中各個文件對象的文件內容執(zhí)行該構建操作之前,上述第一構建步驟還可以包括:解析該構建操作的輸入?yún)?shù)中每個文件對象的文件內容,并提取該文件對象所依賴的文件的文件存儲路徑,分別用該文件對象的文件存儲路徑和所提取的該文件對象所依賴的文件的文件存儲路徑更新文件依賴關系表中的文件存儲路徑和所依賴文件存儲路徑;以及上述第一重構單元405可以進一步配置用于:獲取上述輸入文件集合中文件內容發(fā)生變化的各個輸入文件,組成第一變化輸入文件集合;對上述第一變化輸入文件集合中的每個變化輸入文件,在上述文件依賴關系表中查詢與該變化輸入文件的文件存儲路徑相同的所依賴文件存儲路徑,用與查詢到的所依賴文件存儲路徑對應的各個文件存儲路徑所指示的各個輸入文件組成依賴于該變化輸入文件的依賴輸入文件子集合;合并上述第一變化輸入文件集合中的各個變化輸入文件的依賴輸入文件子集合,得到第二變化輸入文件集合;組合上述第一變化輸入文件集合和上述第二變化輸入文件集合得到變化輸入文件集合。第一重構單元405的具體處理及其所帶來的技術效果可參考圖3對應實施例中關于第一構建步驟和步驟306的可選實現(xiàn)方式的相關說明,在此不再贅述。
本實施例的一些可選的實現(xiàn)方式中,上述構建操作包括以下至少一項:去除注釋、合并、代碼混淆、壓縮、加密、解密。
下面參考圖5,其示出了適于用來實現(xiàn)本申請實施例的電子設備的計算機系統(tǒng)500的結構示意圖。
如圖5所示,計算機系統(tǒng)500包括中央處理單元(CPU,Central Processing Unit)501,其可以根據(jù)存儲在只讀存儲器(ROM,Read Only Memory)502中的程序或者從存儲部分508加載到隨機訪問存儲器(RAM,Random Access Memory)503中的程序而執(zhí)行各種適當?shù)膭幼骱吞幚?。在RAM 503中,還存儲有系統(tǒng)500操作所需的各種程序和數(shù)據(jù)。CPU 501、ROM 502以及RAM 503通過總線504彼此相連。輸入/輸出(I/O)接口505也連接至總線504。
以下部件連接至I/O接口505:包括鍵盤、鼠標等的輸入部分506;包括諸如陰極射線管(CRT)、液晶顯示器(LCD)等以及揚聲器等的輸出部分507;包括硬盤等的存儲部分508;以及包括諸如LAN卡、調制解調器等的網絡接口卡的通信部分509。通信部分509經由諸如因特網的網絡執(zhí)行通信處理。驅動器510也根據(jù)需要連接至I/O接口505??刹鹦督橘|511,諸如磁盤、光盤、磁光盤、半導體存儲器等等,根據(jù)需要安裝在驅動器510上,以便于從其上讀出的計算機程序根據(jù)需要被安裝入存儲部分508。
特別地,根據(jù)本公開的實施例,上文參考流程圖描述的過程可以被實現(xiàn)為計算機軟件程序。例如,本公開的實施例包括一種計算機程序產品,其包括有形地包含在機器可讀介質上的計算機程序,所述計算機程序包含用于執(zhí)行流程圖所示的方法的程序代碼。在這樣的實施例中,該計算機程序可以通過通信部分509從網絡上被下載和安裝,和/或從可拆卸介質511被安裝。在該計算機程序被中央處理單元(CPU)501執(zhí)行時,執(zhí)行本申請的方法中限定的上述功能。
附圖中的流程圖和框圖,圖示了按照本申請各種實施例的系統(tǒng)、方法和計算機程序產品的可能實現(xiàn)的體系架構、功能和操作。在這點上,流程圖或框圖中的每個方框可以代表一個模塊、程序段、或代碼的一部分,所述模塊、程序段、或代碼的一部分包含一個或多個用于實現(xiàn)規(guī)定的邏輯功能的可執(zhí)行指令。也應當注意,在有些作為替換的實現(xiàn)中,方框中所標注的功能也可以以不同于附圖中所標注的順序發(fā)生。例如,兩個接連地表示的方框實際上可以基本并行地執(zhí)行,它們有時也可以按相反的順序執(zhí)行,這依所涉及的功能而定。也要注意的是,框圖和/或流程圖中的每個方框、以及框圖和/或流程圖中的方框的組合,可以用執(zhí)行規(guī)定的功能或操作的專用的基于硬件的系統(tǒng)來實現(xiàn),或者可以用專用硬件與計算機指令的組合來實現(xiàn)。
描述于本申請實施例中所涉及到的單元可以通過軟件的方式實現(xiàn),也可以通過硬件的方式來實現(xiàn)。所描述的單元也可以設置在處理器中,例如,可以描述為:一種處理器包括獲取單元、劃分單元、執(zhí)行單元和存儲單元。其中,這些單元的名稱在某種情況下并不構成對該單元本身的限定,例如,存儲單元還可以被描述為“存儲文件的單元”。
作為另一方面,本申請還提供了一種非易失性計算機存儲介質,該非易失性計算機存儲介質可以是上述實施例中所述裝置中所包含的非易失性計算機存儲介質;也可以是單獨存在,未裝配入終端中的非易失性計算機存儲介質。上述非易失性計算機存儲介質存儲有一個或者多個程序,當所述一個或者多個程序被一個設備執(zhí)行時,使得所述設備:獲取用于構建應用的輸入文件集合、用于構建應用的構建操作集合以及上述構建操作集合中各個構建操作之間的執(zhí)行順序信息;按照預定義的文件存儲路徑與上述構建操作集合中各個入口構建操作的對應關系,將上述輸入文件集合中的每個輸入文件劃分到與該輸入文件的文件存儲路徑對應的入口構建操作所對應的輸入文件子集合中,其中,由每個入口構建操作所對應的輸入文件子集合中的各個輸入文件的文件存儲路徑和文件內容形成的文件對象是該入口構建操作的輸入?yún)?shù);對上述構建操作集合中的每個構建操作,執(zhí)行以下第一構建步驟:在該構建操作沒有前置構建操作或前置構建操作都已經完成的情況下,對該構建操作的輸入?yún)?shù)中各個文件對象的文件內容執(zhí)行該構建操作,并在該構建操作有后置構建操作的情況下將執(zhí)行該構建操作后所得到的輸出參數(shù)中的各個文件對象添加到該構建操作的各個后置構建操作的輸入?yún)?shù)中;將各個出口構建操作執(zhí)行完上述第一構建步驟后所得到的輸出參數(shù)中的各個文件對象的文件內容以文件形式存儲到磁盤,其中,所存儲到磁盤的各個文件是構建所得到的應用的文件。
以上描述僅為本申請的較佳實施例以及對所運用技術原理的說明。本領域技術人員應當理解,本申請中所涉及的發(fā)明范圍,并不限于上述技術特征的特定組合而成的技術方案,同時也應涵蓋在不脫離所述發(fā)明構思的情況下,由上述技術特征或其等同特征進行任意組合而形成的其它技術方案。例如上述特征與本申請中公開的(但不限于)具有類似功能的技術特征進行互相替換而形成的技術方案。