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>
目前我的项目有一个许可证文件。文件没有附加扩展名。文件本身只包含一个密钥。
我有 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>