配置MSBuild输出路径

Configure MSBuild output path

有一个Windows Forms(NET 3.5)项目foo.csproj,其中包含本地化的资源文件。 我使用MSBuild构建项目并创建部署结构:

1
<MSBuild Projects="foo.csproj" Properties="Configuration=Release;OutputPath=..\\deploy\\foo" Targets="Build" />

它将foo.exe和所有本地化的DLL文件复制到deploy\\foo文件夹,但是我需要将本地化的DLL文件复制到单独的文件夹中。 它应该是:

  • deploy \ foo \ foo.exe
  • deploy \ locales \ ru-RU \ foo.resources.dll
  • deploy \ locales \ pt-BR \ foo.resources.dll

有没有一种方法可以配置MSBuild将EXE和DLL文件复制到不同的文件夹?


使用MSBuild命令行,您可以指定输出路径,如下所示:

1
C:\\Program Files (x86)\\MSBuild\\12.0\\Bin\\MSBuild.exe <path_to_project_file> /t:Build /p:OutDir=c:\\custom_build_out\\;Configuration=PRODUCTION;Platform=x64

注意:

  • 如果更改为/ p指定OutDir属性的顺序,则此操作无效。
  • OutDir属性用于指定备用目录的完整路径。 OutputPath用于相对目录。
  • 它必须在自定义生成输出路径中具有项目名称+生成配置名称,因为MSBuild不会将这些内容附加到OutDir

  • 资源文件的生成和复制是在内部MSBuild过程中完成的:GenerateSatelliteAssembliesCopyFilesToOutputDirectory。 它们被复制到输出目录中。

    据我所知,您无法修改此行为。

    在构建步骤之后,您必须移动资源文件。 我建议使用MSBuild社区任务中的Move任务。

    1
    2
    3
    4
    5
    6
    7
    <MSBuild Projects="foo.csproj" Properties="Configuration=Release;OutputPath=..\\deploy\\foo" Targets="Build" />

    <CreateItem Include="..\\deploy\\foo\\**\\*.resources.dll">
        <Output TaskParameter="Include" ItemName="ResourcesToMove" />
    </CreateItem>

    <Move SourceFiles="@(ResourcesToMove)" DestinationFiles="@(ResourcesToMove->'..\\deploy\\locales\\%(RecursiveDir)\\%(Filename)%(Extension)')"/>