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

Rog*_*mbe 6 msbuild

我正在使用MSBuild如下任务:

<MSBuild Projects="Foo.csproj">
    <Output TaskParameter="TargetOutputs" ItemName="FilesToDeploy" />
</MSBuild>
Run Code Online (Sandbox Code Playgroud)

但是,FilesToDeploy项目组仅包含项目文件生成的.EXE文件; 它不包含该Foo.exe.config文件.

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

我在其他地方发现了类似的问题,但没有答案.

我该如何解决这个问题?

Pet*_*voy 6

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

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

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

MSBuild任务的文档指示"TargetOutputs"输出将包含在该被调用目标的"输出"中声明的项目 - 在这种情况下,它是单个项目,即属性$(TargetPath)in的值被叫项目.这包含生成的可执行文件或DLL的名称(注意,不仅是缺少的.config但是任何引用的程序呢!)

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

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

这是非常容易打理,如果你知道当的csproj文件是建立,它将输出所有项目到一个单独的文件夹中.在Visual Studio中构建时也是如此,因为它将所有编译输出放入bin\Debug.所以你会认为FilesToDeploy是$(OutDir)\**\*.*.但是当您的项目由TeamBuild构建时,情况并非如此 - 因为TeamBuild会将OutDir更改为每个项目输出的全局"Binaries"目录(以防止重复构建等).那就意味着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>
Run Code Online (Sandbox Code Playgroud)

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