超棒的建置工具

最初的 Selenium 建置工具,從無到有發展成極其笨重,使其既瘋狂又「有趣」地使用。

此文件先前位於 wiki 上

WebDriver 是一個大型專案:如果我們嘗試將所有內容都放入單個單體式建置檔案中,最終將變得難以管理。我們知道這一點。我們已經嘗試過了。因此,我們將單個 Rakefile 分解為一系列 build.desc 檔案。每個檔案都描述了建置的一部分。

讓我們看看 build.desc 檔案。這是 主要測試 build.desc 的一部分

java_test(name = "single",
  srcs = [
    "SingleTestSuite.java",
  ],
  deps = [
    ":tests",
    "//java/server/src/org/openqa/selenium/server",
    "//java/client/test/org/openqa/selenium/v1:selenium-backed-webdriver-test",
    "//java/client/test/org/openqa/selenium/firefox:test",
  ]  ])

目標

這突顯了大多數關鍵概念。首先,它宣告了目標,在本例中,只有一個 java_test 目標。每個目標都有一個 name 屬性。

目標名稱

「build.desc」檔案的位置和名稱的組合用於派生生成的 rake 任務。所有任務名稱都以「//」開頭,後跟包含「build.desc」檔案的目錄路徑(相對於 Rakefile),然後是「:」,最後是「build.desc」中目標的名稱。一個範例會使這一切更加清楚 :)

此範例產生的 rake 任務是 //java/client/test/org/openqa/selenium:single

簡短目標名稱

作為捷徑,如果目標以包含「build.desc」檔案的目錄命名,您可以省略冒號後面的 rake 任務名稱部分。在我們的範例中://java/server/src/org/openqa/selenium/server//java/server/src/org/openqa/selenium/server:server 相同。

隱含目標

某些建置規則提供隱含目標,並為一般建置目標提供相關擴展。範例包括產生原始碼封存檔或執行測試。這些是透過在建置規則的完整名稱後附加另一個冒號和隱含目標的名稱來宣告的。在我們的範例中,您可以使用「//java/client/test/org/openqa/selenium:single:run」執行測試

以下描述的每個規則都有一個與之關聯的隱含目標列表。

輸出

「build.desc」檔案中指定的每個目標都會產生一個且僅一個輸出。這很重要。請記住這一點。通常,所有輸出檔案都放置在「build」目錄中,相對於 rake 任務名稱。在我們的範例中,//java/org/openqa/selenium/server 的輸出將在「build/java/org/openqa/selenium/server.jar」中找到。建置規則應輸出它們產生的任何檔案的名稱和位置。

依賴項

看看上面「single」目標的「deps」部分。":tests" 是對目前「build.desc」檔案中目標的參考,在本例中,它是正上方的「java_library」目標。您還會看到對多個完整路徑的參考。例如 "//java/server/src/org/openqa/selenium/server" 這指的是在超棒的 build.desc 檔案中定義的另一個目標。

瀏覽器

py_test 和 js_test 規則對於在多個瀏覽器中執行相同的測試具有特殊處理。相關的瀏覽器特定中繼資料保存在 rake-tasks/browsers.rb 中。一般使用方法是在目標名稱後附加 _browsername;如果沒有 _browsername 後綴,測試將在所有瀏覽器中執行。

例如,如果我們有一個 js_test 規則 //foo/bar,我們將透過執行目標 //foo/bar_ff:run 在 firefox 中執行其測試,或者我們將透過執行目標 //foo/bar:run 在所有可用瀏覽器中執行。

建置目標

您可以使用 -T 選項列出所有建置目標。例如:

./go -T

簡要說明您可以使用的可用目標。

通用屬性

以下屬性是所有建置目標的必要屬性

屬性名稱類型含義
namestring用於派生 rake 目標和(通常)產生的二進制檔案的名稱

以下屬性是常用的

屬性名稱類型含義
srcsarray要為此目標建置的原始原始碼
depsarray此目標的先決條件

java_library

  • 輸出: 如果設定了「srcs」屬性,則 JAR 檔案以「name」屬性命名。
  • 隱含目標: run(如果指定了「main」屬性)、project、project-srcs、uber、zip
  • 必要屬性: 「name」和「srcs」或「deps」中的至少一個。
屬性名稱類型含義
depsarray如上
srcsarray如上
resourcesarray應複製到 jar 檔案中的任何資源。
mainstringjar 的主類別的完整類別名稱(用於建立可執行 jar)

java_test

  • 輸出: 如果設定了「srcs」屬性,則 JAR 檔案以「name」屬性命名。
  • 隱含目標: run、project、project-srcs、uber、zip
  • 必要屬性: 「name」和「srcs」或「deps」中的至少一個。
屬性名稱類型含義
depsarray如上。
srcsarray如上。
resourcesarray應複製到 jar 檔案中的任何資源。
mainstring用於執行這些測試的替代類別。
argsstring要傳遞給主類別的引數行
syspropertiesarray包含應設定的系統屬性的地圖陣列

js_deps

  • 輸出: 標記檔案以指示任務是最新的。
  • 隱含目標:
  • 必要屬性: 「name」和「srcs」
屬性名稱類型含義
namestring如上
srcsarray如上
depsarray如上

js_binary

  • 輸出: 一個單體式 JS 檔案,其中包含使用 closure compiler 編譯的所有依賴項和原始碼,且未進行最佳化。
  • 隱含目標:
  • 必要屬性: srcs 或 deps 中的至少一個。
屬性名稱類型含義
namestring如上
srcsarray如上
depsarray如上

js_fragment

  • 輸出: 代表匯出函數的匿名函數的原始碼,由 closure compiler 編譯,並開啟所有最佳化。
  • 隱含目標:
  • 必要屬性: name、module、function、deps
屬性名稱類型含義
namestring如上
modulestring包含函數的模組名稱
functionstring要匯出的函數的完整名稱
depsarray如上

js_fragment_header

  • 輸出: 一個 C 標頭檔,其中所有 js_fragment 依賴項都宣告為常數。
  • 隱含目標:
  • 必要屬性: name、deps
屬性名稱類型含義
namestring如上
srcsarray如上
depsarray如上

js_test

  • 輸出
  • 隱含目標: _BROWSER:run、run
  • 必要屬性: 無。
屬性名稱類型含義
depsarray如上。
srcsarray如上。
pathstring預期測試檔案託管在測試伺服器上的路徑。
browsersarray要執行測試的瀏覽器列表,來自 rake_tasks/browsers.rb。僅會嘗試在系統上可用的瀏覽器中執行測試。如果沒有,則預設為系統上的所有瀏覽器。

假設 browsers = ['ff', 'chrome'],對於目標 //foo,將產生隱含目標://foo_ff:run 和 //foo_chrome:run,它們在這些瀏覽器中的每一個中執行測試,並且將產生隱含目標 //foo:run,它在 ff 和 chrome 中都執行測試。

py_test

  • 輸出: 建立執行列出的 python 測試所需的目錄結構。
  • 隱含目標: _BROWSER:run、run
  • 必要屬性: name。
屬性名稱類型含義
depsarrayother_py_tests
common_testsarrayBROWSER_specific_tests
BROWSER_specific_testsarrayBROWSER_specific_tests
resourcesarrayresources
browsersarray要執行測試的瀏覽器列表,來自 rake_tasks/browsers.rb。僅會嘗試在系統上可用的瀏覽器中執行測試。如果沒有,則預設為系統上的所有瀏覽器。

注意:每個 py_test 呼叫都在新的 virtualenv 中執行。

rake_task

  • 輸出: 一個超棒的建置規則,可以參考它來「炸開逃生」艙口並使用普通的 rake 目標。
  • 隱含目標:
  • 必要屬性: name、task_name、out。
屬性名稱類型含義
namestring如上
task_namestring要呼叫的普通 rake 目標
outstring相對於 Rakefile 產生的檔案

gcc_library

  • 輸出: 如果設定了「srcs」屬性,則共享函式庫檔案以「name」屬性命名。
  • 隱含目標: 無。
  • 必要屬性: 「name」和「srcs」。
屬性名稱類型含義
srcsarray如上
archstring「amd64」用於 64 位元建置,「i386」用於 32 位元建置。
argsstring編譯器的引數(例如,-I 旗標)。
link_argsstring連結器的引數(例如,-l 旗標)

注意:首次建置新函式庫時,建置將成功,但複製到預先建置的函式庫將失敗並顯示類似的訊息

cp build/cpp/amd64/libimetesthandler64.so 
go aborted!
can't convert nil into String

解決方案:將剛建置的函式庫複製到適當的預先建置資料夾 (cpp/prebuilt/arch/)。

上次修改時間:2022 年 1 月 10 日:更多 wiki (#907) [部署網站] (adcf706a1ad)