我希望能够在预制件生成的Visual项目中设置一些任意属性,作为站点策略,而不是基于每个项目。
下面是一个有效的例子,但并不理想。这在我的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)发布于 2016-08-25 17:15:07
我认为正确的答案是创建一个新的project调用,在csproj.compilerProps中使用新值,然后使用提交拉请求。这个特性没有什么争议,应该很容易合并…。然后你就不用维护覆盖装置了。
在_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以使用新的、更可扩展的“调用数组”方法,比如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…https://stackoverflow.com/questions/39130550
复制相似问题