如何防止在增量构建期间删除内容文件?

Fre*_*dpo 5 c# msbuild build visual-studio-2015

我有一个包含 3 个项目的 Visual Studio 2015 Update 3 解决方案:

我的顶级应用程序MyApp有一个项目参考,ClassLibrary2而项目参考又在ClassLibrary1

MyApp -> ClassLibrary2 -> ClassLibrary1
Run Code Online (Sandbox Code Playgroud)

ClassLibrary1有一个数据文件,data.bin即要求其正常运行。预计该数据文件将位于与执行应用程序时程序集Resources/所在位置相关的子文件夹中ClassLibrary1。的结构ClassLibrary1类似于:

ClassLibrary1.csproj
    Resources/
        data.bin
    MyClassBehaviorDrivenByData.cs
    ...
Run Code Online (Sandbox Code Playgroud)

data.bin文件的Build Action属性设置为Content(我也尝试过None)并将其Copy to Output Directory设置为Copy If Newer.

如果我做一个完整的解决方案重建,data.bin文件会MyApp按预期找到它的输出目录。但是,如果我对MyApp项目进行一些更改并构建解决方案,data.bin则会从输出目录中删除该文件MyApp(注意:输出窗口显示仅MyApp构建,因为仅MyApp更改了 的代码)。

解决方法:

  1. 我可以使用 post-build 步骤MyApp每次将数据文件强制复制到输出目录MyApp构建时,。但是,这违背了“拥有”开发人员ClassLibrary1如果添加新数据文件、修改现有数据文件或将它们移动到其他地方,则不必担心修改消费项目中的构建后脚本的原则。

  2. 我可以直接添加对ClassLibrary1from的引用MyApp。然而,这违反了在ClassLibrary1API 下隐藏功能/API的愿望ClassLibrary2(即,我不希望ClassLibrary1API 泄​​漏到MyApp)。

我的问题是:是什么导致data.bin文件MyApp在增量构建期间从的输出目录中删除,MyApp有没有办法在不使用上面列出的两种解决方法之一的情况下防止这种情况发生?

sta*_*SFT 1

原因是该文件在增量清理任务中被删除,该任务用于确保文件是最新的(但它只是删除您场景中的文件)。为了解决这个问题,您可以添加一个新目标,将必要的文件复制到目标文件夹中。

例如(编辑 csproj 文件,将此代码添加到末尾(之前):

 <ItemGroup>
    <resourceFiles Include="..\ClassLibrary1\Resources\*.*"/>
  </ItemGroup>
<Target Name="AfterBuild" DependsOnTargets="CopyFiles">
 </Target>
 <Target Name="CopyFiles" Inputs="@(resourceFiles)"
        Outputs="@(resourceFiles->'bin\$(Configuration)\Resources\%(filename)%(extension)')">
    <Message Text="after Copy files" Importance="high"/>
    <Copy
           SourceFiles="@(resourceFiles)"
           DestinationFolder="bin\$(Configuration)\Resources"
        />
  </Target>
Run Code Online (Sandbox Code Playgroud)