【问题标题】:How to prevent content files to be removed during incremental build?如何防止在增量构建期间删除内容文件?
【发布时间】:2017-01-25 16:40:46
【问题描述】:

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

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

MyApp -> ClassLibrary2 -> ClassLibrary1

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

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

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

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

解决方法:

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

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

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

【问题讨论】:

  • 在您的输出窗口中,它构建了多少个项目? ClassLibrary1 和 2 是否也构建成功?在构建MyApp之前,如果先构建classlibrary项目,会不会有这个问题?
  • @JackZhai ClassLibrary1、ClassLibrary2 以及 MyApp 在我重建整个解决方案时都成功构建(并且 data.bin 出现在 MyApp 输出目录下的某处)。但是,一旦构建了所有内容并且我破解了 MyApp 然后 Build 解决方案,只有 MyApp 显示在输出窗口中(这是我所期望的,因为我只编辑 MyApp 的代码)。显然,每次修改 MyApp 中的代码时,我都可以重新构建解决方案,但这是一个大型解决方案,完全重新构建是不切实际的。我编辑了这个问题以进一步澄清这一点。
  • 你试试我的解决方法吗?

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


【解决方案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>

【讨论】:

  • 感谢您的回答。该解决方案与我的“解决方法”#1 不同,但似乎也有同样的警告。也就是说,它违反了“拥有” ClassLibrary1 的开发人员如果添加新数据文件(在本例中为文件夹)、修改现有数据文件或将它们移动到其他地方,则不必担心在消费项目中修改 msbuild .csproj 文件的原则.但是,这让我觉得我可以在 ClassLibrary2 中使用 msbuild 来动态添加内容文件。我还没有机会尝试您的解决方案或我刚才描述的解决方案。
  • 我遇到了同样的问题,我在 ClassLibrary1 的项目文件中尝试了这个解决方法,由于 Fredpo 提到的原因,我更希望它出现在这个地方,但正如预期的那样,它不会被复制到任何一个ClassLibrary2 或 MyApp。此外,对解决方案执行清理时不会将其删除。
【解决方案2】:

我也有同样的问题。

虽然我不是很喜欢它,但我的解决方法是在 ClassLibrary2 probject 中包含文件 data.bin 并将“复制到输出目录”设置为“如果较新则复制”。我还将 ClassLibrary1 中 data.bin 的相同属性设置为“请勿复制”。

【讨论】:

  • 将 data.bin 添加到 ClassLibrary2 时,我使用了“添加为链接”,至少可以避免将文件保存在两个地方。
猜你喜欢
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
相关资源
最近更新 更多