MSBuild TargetOutputs不包含Foo.exe.config文件?

时间:2010-08-18 14:38:32

标签: msbuild

我正在使用MSBuild任务,如下所示:

<MSBuild Projects="Foo.csproj">
    <Output TaskParameter="TargetOutputs" ItemName="FilesToDeploy" />
</MSBuild>

但是,FilesToDeploy项目组仅包含项目文件构建的.EXE文件;它不包含Foo.exe.config文件。

另一个问题:Who copies App.config to App.exe.config?解释了MSBuild如何找到/复制配置文件,但我无法弄清楚如何实际获取该名称。

我发现了一个类似的问题elsewhere,但没有答案。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:6)

让我解释一下这里发生了什么。我将不得不假设你在这里建造的子项目是一个未经修改的C-Sharp项目。

默认情况下,.csproj文件的默认目标为“Build”,因此在此处使用MSBuild任务时,它将执行Project中的默认目标。这被定义为

   <Target
        Name="Build"
        Condition=" '$(_InvalidConfigurationWarning)' != 'true' "
        DependsOnTargets="$(BuildDependsOn)"
        Outputs="$(TargetPath)"/>

MSBuild任务的文档表明“TargetOutputs”输出将包含在该被调用目标的“输出”中声明的项目 - 在这种情况下,它是单个项目,即调用项目中属性$(TargetPath)的值。这个 only 包含构建的可执行文件或DLL的名称(请注意,不仅缺少.config,还有任何引用的程序集!)

我正在撤回我的原始解决方案,它获取所有已构建的输出,因为它不起作用 - 它是我在其中一个utiltity导入文件中的目标,但在调查中似乎我实际上并没有使用它在任何地方,加上它要求你引用Microsoft.CloudService.targets(我是,但你是否怀疑)。

我想要做的 你想要做的是将构成Foo.exe(包括.config)的所有文件放到一个项目组中,以便你可以将它们复制到某个地方。这非常棘手,如果你考虑所有可以构成csproj输出的东西:主输出(.exe),配置文件,标记为copyLocal的引用程序集,附属程序集(你的.resx DLLs),内容项等等。

如果你知道在构建csproj文件时它会将所有项目输出到单个文件夹中,这一切都很容易处理。在Visual Studio中构建时也是如此,因为它将所有编译输出放入bin \ Debug。所以你会认为FilesToDeploy是$(OutDir)\**\*.*。但是当你的项目由TeamBuild构建时,这是 - 因为TeamBuild会将OutDir更改为每个项目输出到的全局“二进制”目录(到防止重复构建等)。那就意味着FilesToDeploy将包含该文件夹的内容,我怀疑这是你想要的。

你无疑已经发现了这个(或至少预见到了这一点),这就是为什么你有一个目标要求.csproj“你的构建输出是什么,它们在哪里?”。但是,您可以调用的Microsoft.Common.Targets中没有单个Target声明整个构建输出集。 Azure小组试图解决这个问题(并且可能在他们试图做的事情的背景下成功),我试图在我之前的解决方案中复制它,但它只是不起作用(或者至少,我没有时间让它发挥作用。)

这并非都是理想的,但如果你重新审视我击落的假设,并不是全部都会丢失:如果我们确实知道所有构建输出在内部构建时都会出现在单个文件夹中,问题会更容易解决VS和TeamBuild。然后FilesToDeploy将是一个简单的***。* glob。

如果你要修改你的TfsBuild.Proj和强制项目的OutDir(比如说)$(BinariesRoot)\ FooExe:

,你可以实现这个目的。
<SolutionToBuild Include=$(SolutionRoot)\Sources\Foo.csproj">
    <Properties>
        OutDir=$(BinariesRoot)\FooExe\
    </Properties>
</SolutionToBuild>

我实际上有一套完整的自定义“捆绑”目标 - 在.csproj文件中我可以声明我希望输出的副本转到一组目录,目标会将所有输出复制到每个目录。但是,这只是我必须介绍的内容,因为我花了几个月的时间逐渐将遗留的 nmake.exe 版本转换为原生的MSBuild,我不想在这里发布并且搞砸了这个答案