2016-08-24 82 views
0

我希望能够将我预制生成的Visual Studio项目中的一些任意属性设置为站点策略,而不是基于每个项目。将属性注入到带premake5的VS项目中

下面是一个可行的例子,但它并不理想。这是在我的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

我猜想答案是创建一个新的项目的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使用新的,更ex像vs2010_vcxproj.lua tensible“呼叫数组”的方法:

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

的思想已经越过我的脑海里,但“换基产品”不觉得自己是一个非常可扩展的方法来定制当有经常加入新的特性,以新的扩展VS项目文件。构建系统(如make和VS)之间的区别往往会通过提供这种包装来挫败对它们的接口进行规范化的尝试。 是否有意义,而不是添加一个插入自定义属性作为键/值对的机制?处理XML范围可能很困难,因为它看起来像premake连续写入VS文件,而不是先在内存中创建DOM。 – Soleil

+0

像Premake这样的工具的重点就是提供这种包装,贡献帮助。也就是说,如果'compilerProps'按照描述进行了修改(无论最终是否需要这样做),则可以覆盖'm.elements.compilerProps'并在其中添加/删除新条目以更改写入该块的内容。 – starkos

相关问题