【问题标题】:Using Msbuild variables in Project Extensions在项目扩展中使用 Msbuild 变量
【发布时间】:2019-06-04 08:41:08
【问题描述】:

我目前有一个 web.api 项目的解决方案,我想将它部署到本地 IIS 中的不同虚拟目录。目前我在 api 的 .csproj 中执行以下操作:

<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition="'$(Configuration)' == 'CustomerOne.Debug'">
    <CustomerName>CustomerOne</CustomerName>
    ....
</PropertyGroup>
...

这些变量被广泛地用于 web.config 转换、复制到不同的位置等,通过引用它们,如 $(CustomerName)

它唯一不起作用的地方是在虚拟目录的定义中,即我想将构建配置连接到下面的IISUrl,您可以对其进行硬编码:

<ProjectExtensions>
  <VisualStudio>
    <FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">
      <WebProjectProperties>
        ...
        <IISUrl>http://localhost/api/something</IISUrl>
        ...
      </WebProjectProperties>
    </FlavorProperties>
  </VisualStudio>
</ProjectExtensions>

&lt;IISUrl&gt;http://localhost/api/$(CustomerName)&lt;/IISUrl&gt; 替换它不起作用。想法?

【问题讨论】:

  • 澄清一下:Leo Lui-MSFT 的回答已经回答了为什么它不起作用。我对如何让它工作很感兴趣,即如何根据构建配置配置 IISUrl。
  • 声音类似于我过去遇到的问题。看看this answer提供的解决方案。这个想法是使用DefineConstants

标签: c# asp.net visual-studio asp.net-web-api msbuild


【解决方案1】:

您可以更新基础项目文件。在你的项目文件中这样的 Target 就可以了。

  <Target Name="AfterBuild">
    <PropertyGroup>
      <NewUrl>http://localhost/api/$(CustomerName)</NewUrl>
    </PropertyGroup>
    <Message Text="Updating IISUrl: $(NewUrl) in $(MSBuildProjectFile)" />
    <XmlPeek Namespaces="&lt;Namespace Prefix='msb' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;" XmlInputPath="$(MSBuildProjectFile)" Query="/msb:Project/msb:ProjectExtensions/msb:VisualStudio/msb:FlavorProperties/msb:WebProjectProperties/msb:IISUrl/text()">
      <Output TaskParameter="Result" ItemName="Peeked" />
    </XmlPeek>
    <Message Text="Current Url: @(Peeked)" />
    <!-- Only update the IISUrl if its changed -->
    <XmlPoke Condition=" '@(Peeked)'!='$(NewUrl)' " XmlInputPath="$(MSBuildProjectFile)" Namespaces="&lt;Namespace Prefix='msb' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;" Query="/msb:Project/msb:ProjectExtensions/msb:VisualStudio/msb:FlavorProperties/msb:WebProjectProperties/msb:IISUrl" Value="$(NewUrl)" />
  </Target>

但它确实有副作用。更改基础项目文件意味着 Visual Studio 决定它应该重新加载项目。

要使用它,您不能直接进入调试。而是构建,重新加载项目,然后进入调试。如果您直接进入调试(通过编译),它将使用旧的 url。

【讨论】:

  • 由于我的赏金即将结束,这是唯一真正的解决方案,我将把它奖励给这个答案。尽管它看起来像是一个绝对的用例,但也许没有比通过这样的脚本编辑 .csproj 更好的解决方案了:/
【解决方案2】:

http://localhost/api/$(CustomerName) 替换它不起作用。想法?

这是因为 ProjectExtensions 元素中的任何内容都将被 MSBuild 忽略。

您可以从这个文档ProjectExtensions Element (MSBuild)获取详细信息:

允许 MSBuild 项目文件包含非 MSBuild 信息。 ProjectExtensions 元素内的任何内容都将被忽略 MSBuild

这就是为什么 Msbuild 变量在项目扩展中不起作用的原因。

希望这会有所帮助。

【讨论】:

  • 感谢您提供的信息。但是,您没有提出如何实现该功能的解决方案,即如何动态设置虚拟目录。
  • @EluciusFTW,哦,对不起,我看到你的问题是为什么它不起作用,而不是如何解决它。我以为你不关心解决方案,所以我没有提供解决方案。在&lt;ProjectExtensions&gt; 上使用条件怎么样,比如&lt;ProjectExtensions Condition="'$(Configuration)' == 'CustomerOne.Debug'"&gt;,然后在IISUrl 中设置静态路径,并在IISUrl 中使用另一个静态路径添加另一个条件。如果它适合你,你可以测试它。
  • 再次感谢,我一定会尝试的。但这并不理想,因为我有 20 种构建配置。
  • @Leu Lui-MSFT 不幸的是它不起作用:“元素 中的属性条件无法识别”。
  • @EluciusFTW,是的,我刚刚测试它并得到了相同的结果。因此,Msbuild 变量无法在 ProjectExtensions 元素及其内部使用。我将继续调查它,看看是否有任何解决方案。如果我得到任何更新,我会通知你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多