.vcproj檔案對於visual studio(vc++)使用者來說並不陌生,而.vcxproj是VS2010推出之後,將.vcproj檔案統一改為
.vcxproj,它們都是基於xml的檔案,那麼對它們的解析,有許多庫。這裡我就用libxml。
我要實現的功能很簡單就是項目中所有的工程加入一個 ignorewarning(消除warning),比如/ignore:4011 。
這裡就要寫個指令碼對所有的.vcproj(vs2008以前的版本)或 所有的.vcxproj(vs2010)添加/ignor:4011 。
這裡要特別小心的是:用libxml庫對.vcxproj進行解析要給解析的節點(node)加上預設的命名空間首碼,而對.vcproj
不需要這樣 。
還有一點:加/ignore:4011的位置,.vcxproj和.vcproj是不一樣的。對於具體的ignore warning具體分析啊。
下面我分別給出了對.vcproj和 .vcxproj解析的例子代碼(僅供參考):
# to the .vcproj
require 'libxml'
include LibXMLdef IgnoreWarningAdd(filePath)
parser = LibXML::XML::Parser.file(filePath)
doc = parser.parse doc.find("//Tool").each do |tool|
puts tool['Name']
if tool['Name'] == "VCLinkerTool" && tool['AdditionalOptions'] == " "
tool['AdditionalOptions'] = "/ignore:4011"
end
end doc.save(filePath)
end#recur to find the .vcproj filesdef VcprojWarningAdd(dirPath)
Dir.entries(dirPath).each do |sub|
if sub != '.' && sub != '..'
if File.directory?("#{dirPath}/#{sub}")
VcprojWarningAdd("#{dirPath}/#{sub}")
else
filePath = "#{dirPath}/#{sub}"
#if /*.vcproj/.match(filePath) if File.extname(filePath) == '.vcproj'
IgnoreWarningAdd("#{dirPath}/#{sub}")
end
end
end
end
end#VcprojWarningAdd("E://vcproj_folders")VcprojWarningAdd(ARGV)
#to the .vcxproj require 'libxml'
include LibXML
def IgnoreWarningAdd(filePath)
document = LibXML::XML::Document.file(filePath)
root = document.root # to .vcxproj, need the default namespace prefix to parse the .vcxproj file
root.namespaces.default_prefix = "parsexml_ns"
document.find('//parsexml_ns:Link//parsexml_ns:AdditionalOptions').each do |node|
puts "here I entered"
node << " /ignore:4011 "
end
document.save(filePath)
end
def VcxprojWarningAdd(dirPath)
Dir.entries(dirPath).each do |sub|
if sub != '.' && sub != '..'
if File.directory?("#{dirPath}/#{sub}")
VcxprojWarningAdd("#{dirPath}/#{sub}")
else
filePath = "#{dirPath}/#{sub}"
#if /.vcxproj/.match(filePath) if File.extname(filePath) == '.vcxproj'
puts filePath
IgnoreWarningAdd("#{dirPath}/#{sub}")
puts "here am I: #{dirPath}/#{sub}"
end
end
end
end
end
#VcxprojWarningAdd("E://vcxproj_folder")
VcxprojWarningAdd(ARGV)