如何在 Visual Studio 中构建期间对 JSON 文件应用转换?

问题描述 投票:0回答:1

我有一个由项目 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 和所有依赖它的项目中实现字符串替换的推荐方法是什么?

我研究了单文件生成器,但这听起来像是一个复杂的解决方案,我宁愿避免在所有开发计算机上安装自定义扩展。

谢谢!

json visual-studio .net-core msbuild
1个回答
0
投票

问题在于项目 B 实际上并未从项目 A 的输出文件夹中复制文件。

在执行项目 B 的

GetCopyToOutputDirectoryItems
目标期间,将从 A 直接拾取 json 并将其添加到 B 的
_TransitiveItemsToCopyToOutputDirectory
列表(稍后转储到 B 的输出中)。

您可以做的是确保添加到 A 的

<None>
列表中的文件是已经转换,而不是原始文件。因此,请尽早将您的目标挂钩到构建过程中,执行转换,然后将 transformed 文件添加到
None

© www.soinside.com 2019 - 2024. All rights reserved.