我有一个由项目 B 引用的项目 A (.NET Core)。在项目 A 中,我有一个需要在编译时更新的 JSON 文件(以替换某些值),我希望该 JSON 文件位于项目 B 的构建输出也将被替换。
Sln :
Project A
file.json (build action : none, copy always)
Project B
References
Project A
构建前文件 A 的内容类似于:
{
key : {{this will be replaced during build}}
}
构建后,它是这样的:
{
key : "VALUE"
}
到目前为止,我尝试在项目 A 中使用构建后事件,这对于项目 A 的 bin 文件夹效果很好,但在项目 B 的 bin 文件夹中,我在字符串替换之前有 file.json 。
我尝试禁用加速构建,因为我认为这可能是问题所在,但它似乎并没有改变输出。
我还尝试了 msbuild 任务:
<UsingTask TaskName="TestReplace" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll">
<ParameterGroup />
<Task>
<Reference Include="System.Xml" />
<Using Namespace="System" />
<Using Namespace="System.IO" />
<Code Type="Fragment" Language="cs">
<![CDATA[
var path = "file.json";
var fileContent = File.ReadAllText(path);
fileContent = fileContent.Replace("{{this will be replaced during build}}", "VALUE");
File.WriteAllText(path, fileContent);
]]>
</Code>
</Task>
</UsingTask>
<Target Name="TestReplace" AfterTargets="CopyFilesToOutputDirectory">
<TestReplace />
</Target>
但结果相同(JSON 在项目 A 的输出文件夹中可以,但对于项目 B 则不行)
这是预期的行为还是我配置错误?如果这确实是预期的行为,那么在项目 A 和所有依赖它的项目中实现字符串替换的推荐方法是什么?
我研究了单文件生成器,但这听起来像是一个复杂的解决方案,我宁愿避免在所有开发计算机上安装自定义扩展。
谢谢!
问题在于项目 B 实际上并未从项目 A 的输出文件夹中复制文件。
在执行项目 B 的
GetCopyToOutputDirectoryItems
目标期间,将从 A 直接拾取 json 并将其添加到 B 的 _TransitiveItemsToCopyToOutputDirectory
列表(稍后转储到 B 的输出中)。
您可以做的是确保添加到 A 的
<None>
列表中的文件是已经转换,而不是原始文件。因此,请尽早将您的目标挂钩到构建过程中,执行转换,然后将 transformed 文件添加到 None
。