【问题标题】:NAnt <msbuild> custom output directoryNAnt <msbuild> 自定义输出目录
【发布时间】:2009-02-25 20:19:00
【问题描述】:

我是 NAnt 的新手,并且能够创建一个 &lt;target&gt;

1) 从当前文件夹中删除所有代码

2) 从 SVN 导出新代码

3) 在默认目录 PrecompiledWeb 文件夹(它是一个网络应用程序)中构建代码

这里是:

<target name="export" description="export code from svn">
    <delete dir="${Delete.Dir}"></delete>
    <exec program="svn" commandline="export ${MySVN.Repos} ${MySVN.Dest}" />
    <msbuild project="${Solution.Filename}">
        <property name="Configuration" value="Release"/>
    </msbuild>
</target>

我想指定一个自定义输出目录(“PrecompiledWeb”除外)。这可能吗?您能否告诉我必要的标签/属性?

谢谢!

编辑

感谢 Scott 和 Si,我离解决方案越来越近了,但我仍然没有任何可行的方法。 cmets 将我带到MSBuild's Output Path Property 上的这篇文章。使用他们的代码:

<?xml version="1.0"?>
<project name="test" default="build" basedir="." xmlns="http://nant.sf.net/schemas/nant-0.84.win32.net-1.0.xsd">
    <target name="build">
        <exec program="${framework::get-framework-directory('net-3.5')}/msbuild.exe">
          <arg value="${Full.Path}\Code\MySolution.sln" />
          <arg value="/p:OutputPath=${Full.Path}\Output\" />
        </exec>
    </target>
</project>

这将成功运行;但是,在我的包含网站和类库的解决方案中,它将类库 dll 发布到指定的输出路径,但它仍然将实际网站发布到默认的 PrecompiledWeb 文件夹。 p>

有人对如何从 NAnt 更改 PrecompiledWeb 文件夹路径有任何建议吗?

再次感谢所有帮助过的人!

编辑 2 最终解决方案

这是我最终能够开始工作的内容(针对 .net 4 进行了更新):

<exec program="${framework::get-framework-directory('net-4.0')}/msbuild.exe">
    <arg value="${Full.Path}\Code\MySolution.sln" />
    <arg value="/t:Rebuild" />
    <arg value="/t:ResolveReferences" />
    <arg value="/t:_CopyWebApplication" />
    <arg value="/p:OutDir=${Build.Output}bin\" />
    <arg value="/p:WebProjectOutputDir=${Build.Output}" />
    <arg value="/p:Configuration=Release" />
</exec>

【问题讨论】:

  • 如果您使用 Web 部署项目,您可以为整个网站定义 OutputPath。除此之外,也许您还需要深入研究 Microsoft MSBuild 脚本?

标签: msbuild nant


【解决方案1】:

可以为 msbuild 指定和覆盖一些属性。为了指定输出目录,覆盖 OutputDir 属性。

<target name="export" description="export code from svn">
        <delete dir="${Delete.Dir}" />
        <exec program="svn" commandline="export ${MySVN.Repos} ${MySVN.Dest}" />
        <msbuild project="${Solution.Filename}">
            <property name="Configuration" value="Release"/>
            <property name="OutputDir" value="${Output.Dir}"/>
        </msbuild>
</target>

【讨论】:

  • 也许我做错了什么,但即使添加了该属性标签,它仍然会发布到解决方案文件夹内的 PrecompiledWeb 文件夹。你知道为什么会这样吗?无论如何感谢您的帮助。
  • 啊...刚刚在您的回答中看到它确实是一个网络应用程序。
【解决方案2】:

刚刚快速浏览了一个项目,OutputPath 代替 OutputDir 有帮助吗?

另一个选项可能是 Web 部署项目,我喜欢它,因为它调用 aspnet_compiler 以及 C# 编译器,因此它会发现您在部署之前可能会错过的问题。

【讨论】:

    【解决方案3】:

    我们的一个项目的构建脚本使用此命令发布 Web 应用程序:

    msbuild.exe /t:_CopyWebApplication /p:Configuration=Release /p:OutDir=.\..\published\ /p:WebProjectOutputDir=.\..\published
    

    (此时当前目录设置为 web 应用的项目目录,这就是为什么没有指定 .csproj 文件的原因。整个解决方案已经在脚本的前面重新构建。)

    听起来,WebProjectOutputDir 可能是您需要的属性。

    /t:_CopyWebApplication 也可能很重要。我没有使用过 NAnt,所以我不知道您是否可以将此参数与 msbuild 任务一起传递。您可能需要使用 exec 任务,例如在此示例中:http://www.netomatix.com/development/wapwithnant.aspx。此示例似乎可以一次性重建和复制所有内容。

    【讨论】:

      【解决方案4】:

      使用任务时,正确的属性名称是OutDir,而不是OutputDir:

          <msbuild project="${Solution.Filename}">
              <property name="Configuration" value="Release"/>
              <property name="OutDir" value="${Output.Dir}"/>
          </msbuild>
      

      【讨论】:

        【解决方案5】:

        混淆的来源是您正在混合两个不同的构建系统。您的 NAnt 目标将确定如何将 Web 应用程序发布到解决方案文件的所有工作委派给它,因此通过扩展它引用的 csproj 文件。

        csproj 文件是 MsBuild 文件,因此您可能应该在那里寻找如何指导您的项目输出。 This post by dave^2 可能对这个问题有帮助。

        您可以使用 NAnt 在任意位置发布您的 Web 应用程序,前提是它正在执行发布。您可以对 MsBuild 执行相同的操作。您感到困惑的原因是 NAnt 在这种情况下没有进行发布,并且您让 csproj 文件确定您的 Web 目录的位置。所以要么绕过 csproj 文件,让 NAnt(或 MsBuild)发布代码;或者修改csproj文件,把web应用发布到你想要的地方;或者为您的 Web 应用程序创建第二个位置,并使用您的构建工具将其发布到那里。

        AFAIK,这些选项很详尽。

        【讨论】:

          【解决方案6】:

          嗯,不知道如何在 Nant 中使用 MSBuild,但是使用 NAnt,我以前是这样完成的:

          <solution solutionfile="${build.dir}\solution.sln">
              <webmap>
                 <map url="http://localhost/somdir/project.csproj"
                      path="c:\inetpub\wwwroot\somelocaldir" />
              <webmap>
          </solution>
          

          但是,您使用的是 NAnt 的“解决方案”任务,而不是直接使用 MSBuild。

          编辑: 我也在看一些 msbuild 选项; 如果将 OutDir 和 OutputPath 设置为相同的值,会发生什么?

          【讨论】:

          • 谢谢,但这是一个 .NET 3.5 项目,我认为 标签不支持 .NET 3.5。
          【解决方案7】:

          试试这样的:

          <property name="nant.settings.currentframework" value="net-3.5"/>    
          <msbuild project="${Solution.Filename}">
              <property name="Configuration" value="Release"/>
              <property name="OutDir" value="${Full.Path}\Output\\"/>
              <property name="WebProjectOutputDir" value="${Full.Path}\Output\Web\\"/>
          </msbuild>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-11-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-04-17
            • 2011-04-14
            • 1970-01-01
            相关资源
            最近更新 更多