2016-10-22 68 views
1

我寫了一個調用bash或批量構建腳本的構建系統。現在我將構建腳本複製並粘貼到任何新項目中,並更改與項目相關的屬性。設置項目相關的構建系統變量

爲了避免每次修改腳本(或者只使用一個全局設置的腳本),我希望能夠在sublime項目設置中設置一些變量並將它們放入構建系統中,然後將它們作爲參數發送給腳本。

這是可行的,無需定義每個項目的構建系統?

在情況下,它是與此相關的一些簡化構建腳本

#!/bin/bash 
exe=some_defined_exe 

mkdir -p build 
cd build 
cmake .. 
make -j4 
make install 
cd ../bin 
$exe 
cd .. 

和構建系統

{ 
    "cmd": ["build.sh"], 
    "working_dir": "${project_path:${folder}}", 
    "shell": false, 
} 

而且我想他們是這樣

#!/bin/bash 
exe=$1 

mkdir -p build 
cd build 
cmake .. 
make -j4 
make install 
cd ../bin 
$exe 
cd .. 

{ 
    "cmd": ["build.sh", "${some_project_defined_variable}"], 
    "working_dir": "${project_path:${folder}}", 
    "shell": false, 
} 
+0

這是不可能的,除非您創建'exec.py'的修改版本,這是標準構建系統背後的程序。 – MattDMo

回答

3

由於您已經在使用自定義構建系統,因此可以使用一些插件代碼和對自定義構建系統的一些修改來解決此類問題。

自定義構建系統允許名爲target的屬性指定要運行構建的命令。如果您不提供此功能(大多數構建系統不這樣做),則缺省值爲exec命令。您可以創建自己的自定義命令,以便爲您執行擴展。

作爲一個簡單示例,請參閱以下Python源代碼,您可以在User包中將其保存爲類似custom_build.py的內容。這實現了一個名爲my_custom_build的新命令。執行此命令時,它將通過擴展變量並隨後執行缺省exec命令來轉換它的參數。

import sublime, sublime_plugin 

# List of variable names we want to support 
custom_var_list = ["proj_var_1"] 

class MyCustomBuildCommand(sublime_plugin.WindowCommand): 
    def createExecDict(self, sourceDict): 
     global custom_var_list 

     # Get the project specific settings 
     project_data = self.window.project_data() 
     project_settings = (project_data or {}).get ("settings", {}) 

     # Get the view specific settings 
     view_settings = self.window.active_view().settings() 

     # Variables to expand; start with defaults, then add ours. 
     variables = self.window.extract_variables() 
     for custom_var in custom_var_list: 
      variables[custom_var] = view_settings.get (custom_var, 
       project_settings.get (custom_var, "")) 

     # Create arguments to return by expanding variables in the 
     # arguments given. 
     args = sublime.expand_variables (sourceDict, variables) 

     # Rename the command paramter to what exec expects. 
     args["cmd"] = args.pop ("command", []) 

     return args 

    def run(self, **kwargs): 
     self.window.run_command ("exec", self.createExecDict (kwargs)) 

具體來說,它看起來首先在當前視圖中指定的設置變量,如果他們都沒有找到,在項目的具體設置。仍然找不到任何變量默認爲空字符串。

你需要指定一個自定義生成系統,如:

{ 
    "target": "my_custom_build", 
    "command": ["build.sh", "${proj_var_1}"], 

    "working_dir": "${project_path:${folder}}", 
    "shell": false 
} 

注意,現在有一個target字段指定自定義命令應該在的地方exec執行。還請注意,我們不是將命令行指定爲cmd,而是將其指定爲command

這是因爲在運行自定義命令之前,Sublime似乎預先擴展了構建系統中已知鍵的值。因此,它會嘗試擴展cmd密鑰中的變量,導致${proj_var_1}在我們的命令甚至看到它之前將其展開爲空字符串,這會將它從我們身上剝離。

爲了解決這個問題,我們將密鑰的名稱更改爲Sublime將獨自留下的內容,然後將其交換回代碼中。

由於上面的代碼將嘗試擴展它在構建系統中的任何位置看到的任何變量,但它只需要特別小心以這種方式保護cmd密鑰。例如,如果您想在working_dir密鑰中使用自定義變量,則需要執行類似操作。

+0

精彩,謝謝:) – Zouch