Visual studio 在选定的构建配置上覆盖文件

Visual studio to override file on selected build configuration

目前我的项目有一个许可证文件。文件没有附加扩展名。文件本身只包含一个密钥。

我有 3 个构建配置

Dev
Stage
Prod

目前我有4个许可文件。

GLicense 

GLicense_dev
GLicense_stage
GLicense_prod

我尝试使用#c 预处理器指令,但第三方 dll 要求我的许可证名称与 GLicense 完全相同。我考虑采用的下一个方法是在构建时覆盖 GLicense 的内容。我想知道我该怎么做?

修改您的项目预构建命令行以包含每个配置所需的源文件

copy /y "$(ProjectDir)GLicense_dev" "$(ProjectDir)$(OutDir)GLicense"

copy /y "$(ProjectDir)GLicense_stage" "$(ProjectDir)$(OutDir)GLicense"

copy /y "$(ProjectDir)GLicense_prod" "$(ProjectDir)$(OutDir)GLicense"

您的项目文件将如下所示

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'dev|AnyCPU' ">
  <PreBuildEvent>copy /y "$(ProjectDir)GLicense_dev.txt" "$(ProjectDir)$(OutDir)GLicense.txt"</PreBuildEvent>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'stage|AnyCPU' ">
  <PreBuildEvent>copy /y "$(ProjectDir)GLicense_stage.txt" "$(ProjectDir)$(OutDir)GLicense.txt"</PreBuildEvent>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'prod|AnyCPU' ">
  <PreBuildEvent>copy /y "$(ProjectDir)GLicense_prod.txt" "$(ProjectDir)$(OutDir)GLicense.txt"</PreBuildEvent>
</PropertyGroup>

我相信真正的答案是在 "copy To" 中使用 $(TargetDir)$(ProjectDir)$(OutDir)。您不想在右侧提及 $(ProjectDir)。如果您的输出不在您的项目文件夹中怎么办,甚至可能是不同的计算机。另外,无需更改项目 XML 中的项目文件,您只需打开属性并在 "build events" 中添加此单个事件

if $(ConfigurationName) == dev copy /y "$(ProjectDir)GLicense_dev" "$(TargetDir)GLicense"
if $(ConfigurationName) == stage copy /y "$(ProjectDir)GLicense_stage" "$(TargetDir)GLicense"
if $(ConfigurationName) == prod copy /y "$(ProjectDir)GLicense_prod" "$(TargetDir)GLicense"

另一种方法(这是正确的 Visual Studio 解决方案,因为它消除了 CMD/Batch 编码。你的情况的缺点是,你在 3 个不同的文件夹中有 3 个同名的不同文件),添加您的 3 个文件作为 3 个不同文件夹中的内容添加到项目中,但文件名相同 (GLicense)。并在构建操作中选择 "Copy Always"。然后在项目文件 XML 中将 Condition=" '$(Configuration)' == 'dev' 添加到文件本身而不是 属性 组

<None Include="dev\GLicense" Condition=" '$(Configuration)' == 'dev'>
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="stage\GLicense" Condition=" '$(Configuration)' == 'stage'>
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="prod\GLicense" Condition=" '$(Configuration)' == 'prod'>
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>