我们已经使用 WIX 创建了一个 MSI。 当我们用新的 MSI(新版本)更新软件时,我们想用更新的文件创建日期覆盖 dll,并且我们想保留某些用户配置 xml 文件。
我们已经应用的wix配置:
<RemoveExistingProducts After="InstallFinalize" />设置安装后删除文件。<Component NeverOverwrite="yes">强制安装程序不覆盖某些文件。<File DefaultVersion="2.0.0.0" />强制安装程序覆盖某些文件。通过应用上述 1 和 2,我们设法使安装程序强制文件不被覆盖。 我们如何设法让安装程序强制覆盖文件?以上 3 个选项都不能解决我们的问题。
感谢您的回答!
最佳答案
在 Windows Installer(或其修补程序、服务包或其他任何东西)中没有内置的“覆盖文件,因为它们是较新的日期”功能。规则是基于文件版本的——更高的覆盖更低的——所以最好的长期解决方案是让你有文件版本,并在你构建一个改变的二进制文件时增加它们。然后一切正常。数据文件也是如此。如果它们在初始安装后被更改,则不会被替换。我所知道的每个 MSI 安装都利用了这两个规则,因为这样就可以正常工作了。
https://msdn.microsoft.com/en-us/library/aa367835(v=vs.85).aspx
https://msdn.microsoft.com/en-us/library/aa370531(v=vs.85).aspx
所以你正在发明你自己的版本控制/覆盖方案。
如果二进制文件确实有一个版本,那么 WiX 将在构建时使用它,尽管有 DefaultVersion(有一个你没有提到的抑制文件选项)并且 Windows 将在安装时使用它,所以如果你的文件是版本化的然后将使用版本规则。如果二进制文件根本没有文件版本,那么它们将被视为数据文件,因此在这种情况下,您应该告诉 WiX 使用文件哈希机制,因为如果传入文件的文件哈希是与安装的文件不同:
https://msdn.microsoft.com/en-us/library/aa370532(v=vs.85).aspx
因此,如果 3) 是您唯一的问题,如果他们没有文件版本,请使用文件哈希,否则就文件版本撒谎是不安全的。如果您正在安装的文件的实际版本是 1.0.0,而磁盘上的文件也是 1.0.0,而您撒谎说传入的版本是 2.0.0,那么磁盘上的文件是1.0.0,MSI 文件表中的版本为 2.0.0。换句话说,Windows Installer 可能会注意到已安装的产品已损坏(根据文件表,错误版本的文件位于磁盘上)并可能会尝试使用其弹性功能修复它。正如这里所说,“正确填充……版本……在文件表中”:
http://blogs.msdn.com/b/heaths/archive/2005/12/02/499495.aspx
因为如果原始源 MSI 文件与磁盘上的文件不匹配,您可能会看到提示。
所以你不适合 3) 因为版本说谎不是解决方案,但如果二进制文件中根本没有版本,文件散列将起作用。一般来说,您确实应该使用 Windows 提供的覆盖规则,而不是创建您自己的覆盖规则。如果您这样做,则 1) 较高的二进制版本会覆盖较低的版本,并且 2) 自安装后更新的文件不会被覆盖。使用这些规则将是更好的方法。
关于xml - WIX MSI 定义强制覆盖或永不覆盖文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33650740/
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer