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

时间:2016-09-17 15:38:52

标签: c# visual-studio-2015 build msbuild

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

我的顶级应用程序是MyApp,其ClassLibrary2上有项目引用,而ClassLibrary1上有项目引用:

MyApp -> ClassLibrary2 -> ClassLibrary1

ClassLibrary1有一个正常执行所需的数据文件data.bin。预计此数据文件将在Resources/子文件夹中找到,该子文件夹相对于执行应用程序时ClassLibrary1程序集的位置。 ClassLibrary1的结构类似于:

ClassLibrary1.csproj
    Resources/
        data.bin
    MyClassBehaviorDrivenByData.cs
    ...

data.bin文件的Build Action属性设置为Content(我还尝试使用None),其Copy to Output Directory设置为Copy If Newer }。

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

解决方法:

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

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

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

2 个答案:

答案 0 :(得分:1)

原因是在Incremental Clean任务中删除了该文件,该任务用于确保文件最新(但它只是删除场景的文件)。 要处理此问题,您可以添加新目标以将必要文件复制到目标文件夹。

例如(编辑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>

答案 1 :(得分:1)

我有同样的问题。

我的解决方法,虽然我不是很喜欢它,但是在ClassLibrary2项目中包含文件data.bin并设置&#34;复制到输出目录&#34;到&#34;复制如果更新&#34;。我还为ClassLibrary1中的data.bin设置了相同的属性为&#34;不要复制&#34;。