【问题标题】:MSBuild: changing project references to file binary referencesMSBuild:将项目引用更改为文件二进制引用
【发布时间】:2011-12-07 09:52:09
【问题描述】:

我正在使用 MSBuild 构建一些 .net / C# 项目。

在我正在构建的项目中,有一些项目对其他 C# 项目的引用。

我只构建单个项目,因此我想在构建过程中将项目引用重新指向文件夹中的实际二进制文件。

我已经在我的 MSBuild 步骤中将“BuildProjectReferences”设置为 False。

所以本质上我想让 MSBuild 忽略项目引用并在新目录中查找这些二进制文件。

这可能吗?这是否可能无需在构建之前动态修改项目文件?

** 更新 1 **

更多信息可能会有所帮助...我实际上是通过 Ant/AntDotNet/MSBuild 构建每个二进制文件并上传到 Artifactory。我基本上将 Ivy 的依赖管理与 .Net 二进制文件一起使用。

现在我可以正常上传和下载依赖项。

我唯一缺少的部分是让 MSBuild 将二进制文件作为文件依赖项而不是它在项目文件中的项目引用来查找。

** 更新 2 **

看起来 MSBuild 支持使用 XMLPoke 和 XMLPeek 编辑 csproj 文件。

所以在我的情况下,我需要在我的项目文件中更改以下内容:

<ProjectReference Include="..\MyReferencedProject\MyReferencedProject.csproj">
  <Project>{MyReferencedProjectGUID}</Project>
  <Name>MyReferencedProject</Name>
  <Private>False</Private>
</ProjectReference>

到这里

<Reference Include="MyReferencedProject">
</Reference>

任何人都可以给我任何指示吗?

【问题讨论】:

    标签: visual-studio-2010 xpath ant msbuild xmltask


    【解决方案1】:

    关于更新 2 的答案: 您的问题与this question 相关/重复。没有简单的方法可以转换它。您应该为其编写 MSBuild 自定义任务,以便在构建之前更新 MSBuild 项目文件。

    【讨论】:

    • 对,看起来我需要为此想出某种 XPath 语句。非常感谢 XPath/XSLT 领域的任何帮助。
    • 我不认为你可以通过 XPath/XSLT 做到这一点。您需要从引用的项目中获取 OutputPath 和 AssemblyName 属性并将其应用于二进制引用
    • 我们的命名是标准化的,所以我不需要文件中的任何属性。文件引用将始终与项目名称完全匹配。
    【解决方案2】:

    我最终将 Ant 与 xmltask 插件结合使用。

    <target name="convert" description="convert project references to file references">
        <echo>Converting the following Project references :: ${Project.ItemGroup.ProjectReference.Name}</echo>
        <xmltask source="MyParentProject.csproj" dest="MyParentProject.csproj">
            <rename path="/:Project/:ItemGroup/:ProjectReference/:Name" to="BinaryName"/>
        </xmltask>
        <replace file="MyParentProject.csproj" token="&lt;BinaryName&gt;" value="&lt;Reference Include=&quot;"/>
        <replace file="MyParentProject.csproj" token="&lt;/BinaryName&gt;" value="&quot;&gt;&lt;/Reference&gt;"/>
        <xmltask source="MyParentProject.csproj" dest="MyParentProject.csproj">
            <copy path="/:Project/:ItemGroup/:ProjectReference/:Reference" buffer="refbuffer" append="true"/>
            <paste path="/:Project/:ItemGroup[1]" buffer="refbuffer"/>
            <remove path="/:Project/:ItemGroup/:ProjectReference" /> 
        </xmltask>
        <echo>Conversion complete.</echo>
    </target>
    

    在第一个 xmltask 中,我们将“Name”元素设置为“BinaryName”,以便我们可以找到它。

    接下来我们有两个 Ant Replace 任务,它们会改变类似的东西

    "<BinaryName>MyReferencedProject</BinaryName>" 
    

    "<Reference Include="MyReferencedProject"></Reference>"
    

    在最后一个 xmltask 中,将我们转换为文件引用的项目引用移动到通常具有文件引用的上层 ItemGroup 中。

    最后我们删除 ProjectReferences 部分。

    【讨论】:

      猜你喜欢
      • 2017-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多