使用 premake5 将属性注入 VS 项目
Injecting properties into VS projects with premake5
我希望能够在我的 premake 生成的 Visual Studio 项目中设置一些任意属性,作为站点策略而不是基于每个项目。
这是一个有效的示例,但它并不理想。这是在我的 premake5-system.lua 启动文件中。它会覆盖 vs2015 操作使用的项目生成器,进而有条件地覆盖项目 属性 生成函数。
premake.override(premake.action._list.vs2015, 'onProject', function(base, prj)
-- For C# libraries force static code analysis on.
if premake.project.isdotnet(prj) and prj.kind == premake.SHAREDLIB then
premake.override(premake.vstudio.cs2005, "compilerProps", function(base, cfg)
_p(2, '<RunCodeAnalysis>true</RunCodeAnalysis>')
base(cfg)
end)
end
base(prj)
end)
我不喜欢这个片段明确提到 VS2015,因为这意味着我必须为其他 VS 版本复制它。我不喜欢它明确提到 cs2005 项目生成器,因为如果 premake 停止使用 2005 属性 发射器用于更高版本的 VS 那么这将中断。
这是否可以变得更通用,或者这是否是正确的方法?
更新:
我发现在 onProject() 的覆盖内添加覆盖的方案是有缺陷的,因为如果工作区中有多个项目,内部覆盖将被添加多次,从而多次发出自定义属性在一些项目中。这是一个改进的版本,但我仍然想知道如何避免直接覆盖 cs2005 带来的脆弱性:
premake.override(premake.vstudio.cs2005, "compilerProps", function(base, cfg)
local prj = cfg.project
if premake.project.isdotnet(prj) then
_p(2, '<RunCodeAnalysis>true</RunCodeAnalysis>')
end
base(cfg)
end)
我想 正确的 答案是创建一个新的项目 API 调用,使用 csproj.compilerProps
中的新值,然后 submit a pull request.这个功能没有什么争议,应该很容易合并……然后你就不用维护覆盖了。
_premake_init.lua
中的类似内容:
api.register {
name = "codeanalysis",
scope = "config",
kind = "boolean",
}
vs2005_csproj.lua
中的这个:
if cfg.codeanalysis then
_p(2, '<RunCodeAnalysis>true</RunCodeAnalysis>')
end
然后您可以在您的项目脚本中使用它:
codeanalysis "On" -- or "true" or "yes"
对于奖励积分,您可以重构 csproj.compilerProps
以使用新的、更具扩展性的 "call array" 方法,例如 vs2010_vcxproj.lua
:
m.elements.compilerProps = function(cfg)
return {
m.defineConstants,
m.errorReport,
m.runCodeAnalysis,
m.warningLevel,
m.allowUnsafeBlocks,
m.treatWarningsAsErrors,
m.commandLineParameters,
}
end)
function cs2005.compilerProps(cfg)
p.callArray(m.elements.compilerProps, cfg)
end
function m.defineConstants(cfg)
_x(2,'<DefineConstants>%s</DefineConstants>', table.concat(cfg.defines, ";"))
end
-- and so on…
我希望能够在我的 premake 生成的 Visual Studio 项目中设置一些任意属性,作为站点策略而不是基于每个项目。
这是一个有效的示例,但它并不理想。这是在我的 premake5-system.lua 启动文件中。它会覆盖 vs2015 操作使用的项目生成器,进而有条件地覆盖项目 属性 生成函数。
premake.override(premake.action._list.vs2015, 'onProject', function(base, prj)
-- For C# libraries force static code analysis on.
if premake.project.isdotnet(prj) and prj.kind == premake.SHAREDLIB then
premake.override(premake.vstudio.cs2005, "compilerProps", function(base, cfg)
_p(2, '<RunCodeAnalysis>true</RunCodeAnalysis>')
base(cfg)
end)
end
base(prj)
end)
我不喜欢这个片段明确提到 VS2015,因为这意味着我必须为其他 VS 版本复制它。我不喜欢它明确提到 cs2005 项目生成器,因为如果 premake 停止使用 2005 属性 发射器用于更高版本的 VS 那么这将中断。
这是否可以变得更通用,或者这是否是正确的方法?
更新:
我发现在 onProject() 的覆盖内添加覆盖的方案是有缺陷的,因为如果工作区中有多个项目,内部覆盖将被添加多次,从而多次发出自定义属性在一些项目中。这是一个改进的版本,但我仍然想知道如何避免直接覆盖 cs2005 带来的脆弱性:
premake.override(premake.vstudio.cs2005, "compilerProps", function(base, cfg)
local prj = cfg.project
if premake.project.isdotnet(prj) then
_p(2, '<RunCodeAnalysis>true</RunCodeAnalysis>')
end
base(cfg)
end)
我想 正确的 答案是创建一个新的项目 API 调用,使用 csproj.compilerProps
中的新值,然后 submit a pull request.这个功能没有什么争议,应该很容易合并……然后你就不用维护覆盖了。
_premake_init.lua
中的类似内容:
api.register {
name = "codeanalysis",
scope = "config",
kind = "boolean",
}
vs2005_csproj.lua
中的这个:
if cfg.codeanalysis then
_p(2, '<RunCodeAnalysis>true</RunCodeAnalysis>')
end
然后您可以在您的项目脚本中使用它:
codeanalysis "On" -- or "true" or "yes"
对于奖励积分,您可以重构 csproj.compilerProps
以使用新的、更具扩展性的 "call array" 方法,例如 vs2010_vcxproj.lua
:
m.elements.compilerProps = function(cfg)
return {
m.defineConstants,
m.errorReport,
m.runCodeAnalysis,
m.warningLevel,
m.allowUnsafeBlocks,
m.treatWarningsAsErrors,
m.commandLineParameters,
}
end)
function cs2005.compilerProps(cfg)
p.callArray(m.elements.compilerProps, cfg)
end
function m.defineConstants(cfg)
_x(2,'<DefineConstants>%s</DefineConstants>', table.concat(cfg.defines, ";"))
end
-- and so on…