首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用premake5向VS项目注入属性

用premake5向VS项目注入属性
EN

Stack Overflow用户
提问于 2016-08-24 18:26:18
回答 1查看 775关注 0票数 1

我希望能够在预制件生成的Visual项目中设置一些任意属性,作为站点策略,而不是基于每个项目。

下面是一个有效的例子,但并不理想。这在我的premake5-system.lua启动文件中。它重写vs2015操作使用的项目生成器,从而有条件地重写项目属性生成函数。

代码语言:javascript
复制
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带来的脆性:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-25 17:15:07

我认为正确的答案是创建一个新的project调用,在csproj.compilerProps中使用新值,然后使用提交拉请求。这个特性没有什么争议,应该很容易合并…。然后你就不用维护覆盖装置了。

_premake_init.lua中是这样的

代码语言:javascript
复制
api.register {
    name = "codeanalysis",
    scope = "config",
    kind = "boolean",
}

vs2005_csproj.lua

代码语言:javascript
复制
if cfg.codeanalysis then
    _p(2, '<RunCodeAnalysis>true</RunCodeAnalysis>')
end

然后您可以在您的项目脚本中使用它:

代码语言:javascript
复制
codeanalysis "On"  -- or "true" or "yes"

为了获得额外的积分,您可以重构csproj.compilerProps以使用新的、更可扩展的“调用数组”方法,比如vs2010_vcxproj.lua

代码语言:javascript
复制
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…
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39130550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档