我希望能够在我的预制生成的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)
答案 0 :(得分:0)
我认为正确的答案是创建一个新的项目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
以使用新的,更具扩展性的&#34;呼叫数组&#34;方法如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…