【问题标题】:Convert long name to short name in NANT?在 NANT 中将长名称转换为短名称?
【发布时间】:2010-11-10 21:30:41
【问题描述】:

我正在开发一个 NANT 构建项目来构建一个 VS 项目。其中一个构建文件具有如下属性定义:

<property name="App.dir" 
  value ="${directory::get-current-directory()}\Source\App"/>

此属性值已在许多其他地方使用。例如:

<exec program=".\test.exe"  workingdir=".">
  <arg line="${App.dir}\project1\resources\res1.resx /arg2"/>

这里我需要使用 而不是 是将指定的 2 个参数传递给 text.exe。

当我在另一个开发人员的机器上构建这个 NANT 项目时,我遇到了构建失败。最后我发现那个开发者机器上的 ${App.dir} 是一个长格式的路径,并且路径中有一个空格。结果,text.exe 的参数实际上是 3 个或更多。

我不确定是否有任何方法可以将 ${App.dir} 路径转换为不带空格的短名称:

<property name="App.dir" value ="????"/>

在哪里????是将 "${directory::get-current-directory()}\Source\App" 转换为简短形式的路径名的东西。有什么办法吗?

我在 Windows XP 中使用 NANT。在Unix/Cgywin中,有one function获取dos名称:

cygpath::get-dos-path

我可以在我的 NANT 构建文件中使用这个吗?

【问题讨论】:

    标签: nant


    【解决方案1】:

    使用,来自NANT docs

    value - 单个命令行参数;可以包含空格字符。

    【讨论】:

    • arg 中的任何值都将传递给我的 regsgen 以运行。 arg 中的空格导致了问题。
    • 如果您使用 如果需要,该值将被自动引用。作为替代方案,您可以使用 .
    • value 属性会将整个值作为 ONE 参数。如果值中有空格,它将在值周围添加引号。我的问题是将值作为参数传递给我的 exec exe 程序。如果 ${app.dir} 的值是 的一部分,则参数解释错误。
    【解决方案2】:

    我认为我找到了两种解决问题的方法。我可以在参数周围使用引号,而不是将路径转换为 ​​DOS 路径(8.3 名称)。第二种方法是 ovado 推荐使用 作为单个参数值的方法。这是我的测试示例。所有测试文件都在我的 C:\Test 文件夹中。首先,我创建了一个测试球棒:

    @REM This is the content of Test.bat file.
    @echo COMMAND PARAMETERS: %*
    @echo FIRST PARAMETER: %1
    @echo SECOND PARAMETER: %2
    dir %1
    

    然后我创建了一个测试构建文件(Test.Build)”

    <project>
      <target name="Test" description="Test with one line" failonerror="true">
        <property name="App.dir" value ="C:\Program Files"/>
        <exec program="test.bat"  workingdir=".">
          <arg line='"${App.dir}\Microsoft*.*" ${App.dir}\test2 /test3' />
        </exec>
      </target>
      <target name="Test2" description="Test2 with values" failonerror="true">
        <property name="App.dir" value ="C:\Program Files"/>
        <exec program="test.bat"  workingdir=".">
          <arg value="${App.dir}\Microsoft*.*" />
          <arg value="${App.dir}\test2" />
          <arg value="/test3" />
        </exec>
      </target>
    </project>
    

    这里我使用 " 来结束我在 中的第一个参数。请注意,我在属性 line。

    以这种方式,我通过 NANT.EXE 运行我的构建。我得到了预期的结果:

    C:\Test>NANT.exe -buildfile:test.build Test
    
    Test:
       [exec] COMMAND PARAMETERS: "C:\Program Files\Microsoft*.*" C:\Program Files\test2 /test3
       [exec] FIRST PARAMETER: "C:\Program Files\Microsoft*.*"
       [exec] SECOND PARAMETER: C:\Program
       [exec] C:\Test\>dir "C:\Program Files\Microsoft*.*"
       [exec]  Volume in drive C has...
       ....
    

    我使用替代 Test2 得到了相同的结果,

    C:\Test>NANT.exe -buildfile:test.build Test2
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      相关资源
      最近更新 更多