Msbuild 解决方案必须编译两次才能成功

Msbuild 解决方案必须编译两次才能成功,msbuild,visual-studio-2013,nuget,t4,Msbuild,Visual Studio 2013,Nuget,T4,我的一个项目是使用Clarius Transformation nuget包在构建期间转换.tt文件,而无需在每台机器上安装VS建模SDK。但是,在其中一种解决方案中,它似乎没有转换文件,并生成许多错误 我如何保证这一转变得以完成 更新 我认为问题可能在于nuget包没有致力于源代码控制。然后VisualStudio需要下载包,并且只有在下载包之后才能运行转换。但这只是一个不确定的情况。我不确定您的具体情况,但听起来您有一个与其中一个项目相关的后期/预构建操作,它以错误的顺序创建文件。检查其中一

我的一个项目是使用Clarius Transformation nuget包在构建期间转换.tt文件,而无需在每台机器上安装VS建模SDK。但是,在其中一种解决方案中,它似乎没有转换文件,并生成许多错误

我如何保证这一转变得以完成

更新
我认为问题可能在于nuget包没有致力于源代码控制。然后VisualStudio需要下载包,并且只有在下载包之后才能运行转换。但这只是一个不确定的情况。

我不确定您的具体情况,但听起来您有一个与其中一个项目相关的后期/预构建操作,它以错误的顺序创建文件。检查其中一个自定义生成选项是否具有此类操作,并确保其在生成顺序中的位置正确。

我猜您使用的是较旧的基于MSBuild的包还原,该还原过程中还原NuGet包的时间太晚,无法运行NuGet包中的自定义MSBuild目标

基于MSBuild的包还原在右键单击解决方案并选择“启用NuGet包还原”时启用,它会将.NuGet/NuGet.targets文件添加到项目中。如果使用基于MSBuild的包还原,则在生成期间,MSBuild将还原NuGet包。但是,Clarius.TransformOnBuild NuGet包的还原将太晚,MSBuild无法使用自定义MSBuild Clarius.TransformOnBuild.targets并运行转换

如果不使用基于MSBuild的包还原,并且依赖于由Visual Studio本身完成的较新的自动包还原,则文本模板应该可以工作。使用较新的自动包还原,VisualStudio在启动生成时但在启动MSBuild之前还原包。这意味着任何自定义MSBuild目标都已由MSBuild正确加载并可供使用。为了解决这个问题,引入了较新的自动包还原

从:

在Visual Studio调用MSBuild之前恢复包。这允许在MSBuild启动之前还原通过目标/props文件导入扩展MSBuild的包,从而确保生成成功

使用Visual Studio 2013进行测试,在安装了文本模板和Clarius.TransformOnBuild NuGet软件包的情况下,自动软件包还原允许文本模板在第一次生成期间运行。对于基于MSBuild的包还原,文本模板不是第一次运行,而是仅在NuGet包还原后的第二次生成上运行

因此,您的选择是:

  • 停止使用基于MSBuild的包还原
  • 将您的NuGet软件包签入源代码管理

  • 没有手动设置生成操作。奇怪的是,如果我卸载带有Clarius文本转换包的项目并再次加载它,转换就完成了,构建工作正常。实际上,我已经从解决方案和工作区中删除了nuget.targets和nuget.exe文件。我还从我的项目中删除了对nuget.targets的引用。唯一保留的是clarius.transformonbuild.Targets的导入项目以前使用了MSBuild集成包还原,我按照Nuget站点上的步骤迁移到自动还原。如果我在没有TFS的情况下创建一个新项目,它可以工作,但是现有项目会恢复包,但它没有从Clarius.transformonbuild.targets运行Exec任务,可能是因为_TextTransform.Identity的值为空(尽管我不知道这个变量的含义)