【问题标题】:How to resolve NAnt Error creating FileSet in TeamCity?如何解决在 TeamCity 中创建 FileSet 的 NAnt 错误?
【发布时间】:2015-04-02 11:19:18
【问题描述】:

我正在使用 TeamCity 构建并部署到我们的演示站点。我们有一个名为 HTML Demo Site 的配置,其中一个构建步骤是使用 NAnt 将 HTML 部署到站点。

构建文件已经定义了一个目标:

<target name="deploy-html" description="Deploys the HTML to the demo server">
    <echo message="Deploying HTML to the demo server..."/>
    <copy todir="\\<server>\<dir>\<client>" includeemptydirs="true" overwrite="true">
        <fileset basedir="..\html\_master">
            <include name="**\*"/>
            <exclude name="node_modules\**"/>
        </fileset>
    </copy>
</target>

每次我在 TeamCity 上运行构建时,都会出现以下错误:

C:\tc\w\9149e011dfa8657d\build_scripts\website.build(27,14):
[NAnt output] Error creating FileSet.
[NAnt output]     The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.

所以我尝试在 PowerShell 上运行以获取超过最大长度的文件列表:

Get-ChildItem -Recurse | Where-Object {$_.FullName.Length -gt 248}

但返回的唯一文件是 node_modules 目录下的文件。但在构建文件中,它被排除在外。所以我不确定还能去哪里看?有什么想法吗?

【问题讨论】:

  • 1.您是否在构建机器上运行了 powershell? 2. node_modules 文件夹是直接在_master 文件夹下吗?如果没有将排除条件更改为“*/node_modules/”。 3、Team city在构建服务器“C:\tc\w\9149e011dfa8657d\build_scripts”的文件夹名称中添加长id
  • 1.我在本地机器和构建机器上都运行了 PowerShell。 2. node_modules 目录位于 _master 目录下。其他:我还在两台机器上本地运行了 NAnt 脚本。在我的本地机器中,NAnt 按预期忽略了 node_modules 目录。在构建机器中,NAnt 脚本忽略排除条件并包含导致错误的 node_modules 目录。
  • 两台机器上的 NANT 版本相同?如果是,是哪个版本?我会在我的机器上测试一下,稍后告诉你。
  • 刚刚在我的机器上测试过,当路径长度超过windows允许的长度时会出错。它不会在本地发生,因为您的本地路径没有达到限制,如果您重命名其中的某些文件夹,它也会在本地引发错误。我没有时间查看 NANT 代码并找出排除文件夹发生这种情况的原因。稍后会花一些时间。
  • 以下是您应该了解的 Windows API 的一些限制: #define MAX_PATH 260 // 完整路径的最大长度 #define MAX_DIR 256 // 路径组件的最大长度 #define MAX_FNAME 256 // 最大值文件名组件长度 #define MAX_EXT 256 // 扩展组件的最大长度

标签: node.js powershell teamcity nant


【解决方案1】:

您可以尝试一些方法:

  • 先删除node_modules目录
  • &lt;exec&gt; 任务中使用robocopy /mir
  • 尝试将 exclude 先放在 include 之前(不太可能,但值得一试)
  • 尝试将路径表达式更改为 name="node_modules\**\*"name="**\node_modules\**" 或类似名称

【讨论】:

  • 第一个选项对我有用。正如您所怀疑的那样 - 首先排除是行不通的。
【解决方案2】:

删除首先对我有用 - 但内置的 nant 删除任务也有问题,所以我不得不使用 rmdir 控制台命令

<exec program="${environment::get-variable('WinDir')}\system32\cmd">
    <arg value="/c &quot;rmdir /q /s ${Build.BuildFolder}\WebApplication\node_modules&quot;" />
</exec>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    相关资源
    最近更新 更多