设置项目相关的构建系统变量

时间:2016-10-22 13:58:57

标签: sublimetext3 sublime-build

我编写了一个调用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,
}

1 个答案:

答案 0 :(得分:3)

由于您已经在使用自定义构建系统,因此您可以使用一些插件代码和对自定义构建系统的一些修改来解决此类问题。

自定义构建系统允许名为target的属性,该属性指定要执行以运行构建的命令。如果您没有提供此功能(大多数构建系统都没有),则默认为exec命令。您可以创建自己的自定义命令,以便为您执行扩展。

作为一个简单示例,请参阅以下python源代码,您可以将其保存为custom_build.py包中的User。这实现了一个名为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}扩展为空字符串,然后我们的命令才会看到它,这会将它剥离在我们身上。< / p>

为了解决这个问题,我们将密钥的名称更改为Sublime将单独留下的内容,然后将其交换回代码中。

如上所述,上面的代码将尝试扩展它在构建系统中任何位置看到的任何变量,但只需要特别注意以这种方式保护cmd密钥。例如,如果要在working_dir键中使用自定义变量,则需要执行类似的操作。