2

我使用 CoApp 创建了一个 nuget 包来打包一些代码生成器(二进制文件)。我希望能够在 msbuild custombuild 步骤中使用这些代码生成器来生成代码

我有一个定义以下内容的目标文件(使用 CoApp)

<SetEnv Condition="'$(Platform.ToLower())' == 'x64' And '$(PlatformToolset.ToLower())' == 'v100' And ( $(Configuration.ToLower().IndexOf('debug')) == -1 )" Name="PATH" Prefix="true" Value="$(MSBuildThisFileDirectory)../..//build/native/bin/x64\v100\Release;">
  <Output TaskParameter="OutputEnvironmentVariable" PropertyName="PATH" />
</SetEnv>

包含此代码段的目标文件像这样导入项目(vcxproj 文件)

<Import Project="..\packages\habitat.id.redist.1.0.0.5\build\native\habitat.id.redist.targets" Condition="Exists('packages\habitat.id.1.0.0.1\build\native\habitat.id.targets')" />

项目内

<Exec Command="echo %PATH%"/>

返回期望的结果,即采取形式的结果 ../..//build/native/bin/x64\v100\Release;C:\

所以我可以调用我想从项目中运行的可执行文件。(除了与 custombuild 命令步骤不同,没有 . 的概念outputs。因此增量构建将不起作用)

然而

<CustomBuild Include="..\directory\filename">
  <FileType>Document</FileType>
  <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
  echo $(PATH)
</Command>

不包含通过 SetEnv 设置的我想要的路径。

我想这样做,以便可以在自定义构建步骤中调用通过 nuget 打包的代码生成器。

我了解command内部custombuild运行/在新 cmd 中运行,并且环境是通过设置的用户或系统环境继承的。此外,我可以使用 启动 Msbuild /p:useenv ,从而泵出我想要的任何环境。在我看来,这/p:useenv相当于硬编码路径 - 提前知道它。

我希望能够更新我的包并运行,即我希望项目管理路径,因为它是在导入的目标文件中定义的。

4

1 回答 1

1

看起来 C++ 在支持二进制包更新之前还有一些路要走。标头(ClCompile > AdditionalIncludeDirectories)和库(Link > Additionaldependencies)很好

我想继续使用自定义构建,因为它是通过标准 Visual Studio 属性表公开的,自定义目标不是(直到您自定义属性表,因此引入了不是每个人都熟悉的东西,会忘记安装然后抱怨) 所以我希望通过下一次产品更新获得产品级解决方案。这看起来不太可能

我希望继续使用环境变量方法,因为这是 CoApp 为它为 C++ 二进制文件创建的 nuget 包所做的方式。更改目标文件很容易。(不使用 CoApp 的 Write-NugetPackage 而是使用 nuget pack)

custombuild 命令不会扩展 msbuild 属性集 $(MSBuildThisFileDirectory)../..//build/native/bin/x64\v90\Release 和使用 $(HabitatBindir)aemcomp.exe -nonotice -mlf -dll %(Identity) 的一样 Target-Exec-Property 是我能想到的最佳组合

当我弄清楚如何发布大量双引号和单引号文本时,将在下面发布代码

于 2016-04-21T18:14:22.993 回答