NAnt <msbuild>自定义输出目录</msbuild>

时间:2009-02-25 20:19:00

标签: msbuild nant

我是NAnt的新手,并且能够创建一个<target>

1)删除当前文件夹中的任何代码

2)从SVN导出新代码

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

这是:

<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,我正在接近一个解决方案,但我仍然没有任何有效的方法。有评论引导我阅读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文件夹。

有没有人对如何从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>

7 个答案:

答案 0 :(得分:9)

可以指定并覆盖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>

答案 1 :(得分:7)

只是快速浏览一个项目, OutputPath 而不是OutputDir帮助?

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

答案 2 :(得分:5)

我们其中一个项目的构建脚本使用此命令发布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。此示例似乎可以一次性重建和复制。

答案 3 :(得分:4)

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

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

答案 4 :(得分:1)

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

csproj文件是MsBuild文件,因此您应该查看如何指导项目输出。 This post by dave^2可能会对此问题有所帮助。

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

AFAIK,这些选项都是详尽无遗的。

答案 5 :(得分:0)

嗯,不知道如何在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&amp; OutputPath到相同的值,会发生什么?

答案 6 :(得分:0)

尝试这样的事情:

<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>