如何解决在TeamCity中创建FileSet时的NAnt错误?

4
我将使用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在构建服务器的文件夹名称中添加了一个长ID:“C:\ tc \ w \ 9149e011dfa8657d \ build_scripts”。
- Isaiah4110
  1. 我在本地机器和构建机器上都运行了PowerShell。
  2. node_modules目录位于_master目录下面。其他:我也在两台机器上本地运行了NAnt脚本。在我的本地机器上,NAnt按预期忽略了node_modules目录。在构建机器上,NAnt脚本忽略了排除条件并包括了node_modules目录,导致错误发生。
- TimAlonso
两台机器上的NANT版本相同吗?如果是,是哪个版本?我会在我的机器上进行测试,并稍后告诉您。 - Isaiah4110
刚在我的电脑上测试了一下,当路径长度超过Windows允许的长度时,它会出错。你本地没有达到限制,所以这种情况不会发生在你身上,如果你重命名其中的一些文件夹,它也会在本地抛出错误。我没时间查看NANT代码并找出为什么排除的文件夹会出现这种情况。稍后会花些时间来解决。 - Isaiah4110
这里有些 Windows API 的限制,你应该了解:#define MAX_PATH 260 // 完整路径的最大长度 #define MAX_DIR 256 // 路径组件的最大长度 #define MAX_FNAME 256 // 文件名组件的最大长度 #define MAX_EXT 256 // 扩展名组件的最大长度 - Isaiah4110
嗨@Isaiah4110,感谢您的回复。如果仍然相关,则两个机器都具有NAnt 0.91的相同版本(Build 0.91.4312.0; release; 22/10/2011)。我认为通过排除node_modules目录,它不会影响路径长度。目前,我有一个非常脆弱的解决方案,包括单个文件/目录并排除node_modules目录。似乎<include name="node_modules\**" />优先于其他排除模式(如果我错了,请纠正我?)。是否有一种方法可以解决这个问题,而不需要修改MAX_PATH等,因为我们有多个构建服务器。 - TimAlonso
2个回答

3
您可以尝试以下几种方法:
  • 首先删除node_modules目录
  • <exec>任务中使用robocopy /mir
  • 尝试在include之前放置exclude(不太可能,但值得一试)
  • 尝试将路径表达式更改为name="node_modules\**\*"name="**\node_modules\**"等类似表达式

第一个选项对我起作用了。正如你所怀疑的那样 - 先放置排除不起作用。 - fiat

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接