如何在Wix中包含片段?

Ste*_*zzi 13 wix wix3.5

我创建了一个wixlib来在一些wix项目中共享片段.
我可以使用PropertyRef引用在我的主wix文件中具有Property的片段,但是如何在我想要其内容的批量副本的地方引用片段?
例如,我有一个片段,测试是否安装.net框架,我想在项目标签中的主wix文件中包含该片段...
这是我想要包含在几个wix项目中的wixlib中的片段:

  <Fragment Id="fm35">
    <PropertyRef Id="NETFRAMEWORK35" />
    <Condition Message="framework 3.5 is not installed">
      <![CDATA[Installed OR NETFRAMEWORK35]]>
    </Condition>
  </Fragment>
Run Code Online (Sandbox Code Playgroud)

谢谢!!

Ale*_*lex 19

回到wix 2的旧时代,我们曾经有过FragmentRef元素.在"产品"部分中包含任何片段非常容易,读取xml的人很容易弄清楚正在做什么.

<FragmentRef Id="CustomActionFrag" />
<FragmentRef Id="PropertiesFrag" />
Run Code Online (Sandbox Code Playgroud)

现在在wix 3中,他们已经删除了FragmentRef元素.不知道为什么.我发现它很烦人,因为在我的Product元素中我必须添加几个引用"我的片段中定义的东西"

<CustomActionRef Id="caDoSomething"/>
<PropertyRef Id="PropCryptic"/>
Run Code Online (Sandbox Code Playgroud)

如果我不这样做,片段将被完全忽略,并且不会进入最终的MSI.

对于阅读xml的人来说,这是非常神秘的.把我的FragmentRef给回来!


Yan*_*nko 15

这是一个有趣的问题!教程说任何可以委托给片段的东西都有它的变体标签:FeatureRef for Feature,PropertyRef for Property等.但是,你问题中片段的内容不会发出任何错误,项目构建正常.

我不知道它是否是故意的,Fragment元素本身没有ref兄弟FragmentRef.由于某种原因,Fragment元素具有可选的Id属性,但它表示由高级用户设置为标记部分.我不知道这意味着什么......

但是,你似乎可以在这里作弊.:-)在Fragment中添加一个假的ComponentGroup元素,它不包含任何实际的组件:

  <Fragment>
    <PropertyRef Id="NETFRAMEWORK35" />
    <Condition Message="framework 3.5 is not installed">
      <![CDATA[Installed OR NETFRAMEWORK35]]>
    </Condition>
    <ComponentGroup Id="Fake" />
  </Fragment>
Run Code Online (Sandbox Code Playgroud)

现在,您可以在主Product.wxs中引用ComponentGroup,整个Fragment的内容将按照手册的承诺包含在内:

   <Feature Id="ProductFeature" Title="My product feature" Level="1">
      <ComponentRef Id="ProductComponent" />
      <ComponentGroupRef Id="Fake"/>
   </Feature>
Run Code Online (Sandbox Code Playgroud)

只要ComponentGroup对MSI本身没有任何意义,它就不会给MSI包带来垃圾.但它污染了源代码,当然......