使用nant msi任务创建msi

我正在尝试为我的应用程序创建一个msi。 我使用以下命令传递client和version参数: C: my client nant -D:client = abc -D:version = 1.0 我收到以下错误消息: **
[msi] Building Installer Database 'C:irx-clientirxclient.msi'.
      [msi] Adding Properties:
      [msi]  ProductName
      [msi]  ProductVersion
      [msi]  Manufacturer
      [msi]  ProductCode
      [msi]  UpgradeCode
      [msi]  ALLUSERS
      [msi]  TARGETDIR
      [msi] Adding Directories:
      [msi]  client
      [msi]  bitmaps
      [msi]  icsrun552
      [msi]  nls
      [msi]  reports
      [msi] Compressing Files...
                 [exec] Starting 'cabarc (-r N C:my-clienttargetmyclient.cab *)' in 'C:Documents and Settingsuser123Local SettingsTemptmp12AE.tmp' BUILD FAILED
** 但是,我可以成功手动运行以下命令:
C:my-clienttargetcabarc -r -p n myclient.cab *.*
我已经安装了cabarc.exe,nantcontrib和microsoft platform sdk,并将它们包含在PATH变量中。 请告诉我这里做错了什么。 nant脚本摘要: 将文件复制到 target appname-version 创建包含 target appname-version 下所有文件和文件夹的msi
    <?xml version="1.0"?>
<project name="my client" default="msi-package">
<!-- import the extra libraries -->
<loadtasks assembly="${path::combine(environment::get-variable('NANT_HOME'),'contrib/bin/NAnt.Contrib.Tasks.dll')}"/>

<!--********************************************************************
  Initialize all the required variables
************************************************************************-->
<property name="source-core" value="./src/core" />
<property name="client" value="client" overwrite="false"/>    
<property name="version" value="3.3.9.7.6" overwrite="false"/>
<property name="client-target" value="./target/appname-version" />
<property name="source-bank" value="./src/${client}"/>
<property name="ProductName" value="appname" />   
<property name="ProductVersion" value="${version}"/>  
<property name="ProductManufacturer" value="manufacturer Inc"/>
<echo message="${client}"/>
<echo message="${version}"/>

<!--********************************************************************
Delete 'target' folder if it exists and create a new empty target folder.
************************************************************************-->

<target name="clean">
  <delete dir="./target" />
</target>

<target name="prepare" depends="clean">
  <mkdir dir="target" />  
<property name="target" value="./target" />
</target>

<!--**************************************************************************************
Copy files from /src/core and /src/client to target/appname-version
****************************************************************************************-->

<target name="copy-core" depends="prepare">
  <copy todir="${client-target}">
     <fileset basedir="${source-core}">
        <include name="**/*.*" />
     </fileset>
  </copy>
</target>
<target name="copy-bank" depends="copy-core">
  <copy todir="${client-target}" overwrite="true">
      <fileset basedir="${source-bank}">
          <include name="**/*.bmp"/>
          <include name="**/*.exe"/>
          <include name="**/*.icx"/>
          <include name="**/*.img"/>
          <include name="**/*.ini"/>
          <include name="**/*.txt"/>
          <include name="**/nls/*.*"/>
          <include name="**/Reports/*.*"/>
      </fileset>
  </copy>
</target> 

<!--**************************************************************************************
                  msi part should go in this section
*****************************************************************************************-->  

<target name="msi-package" depends="copy-bank">           
<!--this section calls the cabarc.exe which has been installed and the PATH environment variable has been edited to include the exe-->
<setenv>
  <variable name="PATH" path="C:Program FilesNAntbin;%PATH%" />
</setenv>

<msi sourcedir="C:my-clienttarget" output="C:my-clientmyclient.msi" verbose="true" debug="true">

<properties>  
  <property name="ProductName" value="appname" /> 
  <property name="ProductVersion" value="${version}"/>    
  <property name="Manufacturer" value="mamufacturer Inc."/>
  <property name="ProductCode" value="{}" />  
  <property name="UpgradeCode" value="{}" />  
  <property name="ALLUSERS" value="2" />
  <property name="TARGETDIR" value="C:appname-version" />
</properties>

<directories>
<directory name="C_CLIENT" foldername="client" root="TARGETDIR"/>
<directory name="C_BITMAP" foldername="bitmaps" root="TARGETDIR"/>
<directory name="C_ICSRUN" foldername="icsrun552" root="TARGETDIR" />
<directory name="C_NLS" foldername="nls" root="TARGETDIR" />
<directory name="C_RPTS" foldername="reports" root="TARGETDIR" />
</directories>        

</msi>
</target>
</project>
    
已邀请:
当我运行确切的命令时,它会因“未知命令”错误而失败,但是如果我删除括号,它就能够创建cab文件。显然,nant将括号与参数一起传递。     
我有同样的问题。出于某种原因,添加
<components>
  <component>
    Your component here
  </component>
</components>
修复了这个问题。 您可以在
<msi>
任务文档页面上检查
<components>
元素所需的元素:http://nantcontrib.sourceforge.net/release/0.85/help/tasks/msi.html 另请参阅此处msi任务的一个很好的示例:示例请求:&lt; msi&gt; nant-contrib的任务     
你尝试过使用devenv.exe吗?我在我的nant脚本中使用它,我能够为我的应用程序创建msi。以下是供您参考的代码段:
<target name="BuildMsi">
    <echo message="Creating installables (.msi) for MyTestApplication, please wait..."/>    
    <exec program="c:program filesMicrosoft Visual Studio 9.0Common7IDEdevenv.exe">
        <arg value="c:My appMy_Test_solution.sln"/>
        <arg value="/build"/>
        <arg value="Release|x86" />
        <arg value="/project"/>
        <arg value="c:My appsetupMy_Test_solution.vdproj"/>
    </exec>
</target>
确保解决方案文件(.sln)路径正确并且存在.vdproj文件。希望这有助于人们在使用nant脚本创建msi文件时寻求帮助。快乐的编码!     

要回复问题请先登录注册