使用premake5将属性注入VS项目

我想能够在我的premake生成的Visual Studio项目中设置一些任意属性,作为网站策略而不是每个项目的基础。

下面是一个可行的示例,但并不理想。这是在我的premake5-system.lua启动文件中。它覆盖了由vs2015操作使用的项目生成器,以便有条件地重写项目属性生成函数。

premake.override(premake.action._list.vs2015,'onProject'function(base,prj)

    --对于C#库,请强制执行静态代码分析。
    如果premake.project.isdotnet(prj)并且prj.kind == premake.SHAREDLIB then
        premake.override(premake.vstudio.cs2005,“compilerProps”,function(base,cfg)
            _p(2'<RunCodeAnalysis>true</RunCodeAnalysis>')
            base(cfg)
        endend

    基本(prj)
end

我不喜欢这个片段明确提到了VS2015,因为这意味着我必须为其他VS版本重复它。我不喜欢它明确地提到cs2005项目生成器,因为如果premake不再使用2005版本的VS以后版本的属性发射器,那么这将被破坏。

这可否变得更加通用,或者这是正确的方法吗?

更新:

我发现在onProject()的覆盖内添加覆盖的方案有缺陷,因为如果工作区中有多个项目,则内部覆盖将被多次添加,从而在某些项目中多次发出自定义属性。这是一个改进版本,但我仍然希望知道如何避免直接覆盖cs2005所带来的脆弱性:

premake.override(premake.vstudio.cs2005,“compilerProps”,function(base,cfg)

    local prj = cfg.project

    如果premake.project.isdotnet(prj)则
        _p(2'<RunCodeAnalysis>true</RunCodeAnalysis>'end

    base(cfg)
end
点赞
用户93921
用户93921

我想正确的答案是创建一个新的项目 API 调用,在 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"  -- 或者 "true" 或者 "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

-- 等等…
2016-08-25 17:15:07