相关疑难解决方法(0)

MSBuild:在Visual Studio中构建解决方案后运行目标

我们有一个包含多个项目的解决方案,并且在我们所有的代码都编译之后,需要在我们的已编译代码上运行一个工具。该工具必须接受从解决方案中构建的所有.dll和.exe文件作为输入(因此,对于增量构建,仅给其刚刚重建的二进制文件是不够的),并且所有这些二进制文件必须最多日期。

现在,我们使用从命令行运行的MSBuild .proj文件来执行此操作,该文件包括所有项目,并使用MSBuild的Output元素在解决方案中查找二进制文件的路径。

这有两个问题,使得该解决方案无法完全满足我们的需求。该工具不需要实际在所有项目上运行,只需在其中一些项目上运行即可。并且要求我们能够在Visual Studio中进行构建。

似乎我需要的是在某些项目的.csproj文件中定义“在我身上运行工具”的内容,收集那些项目的路径,并在该路径集合上运行该工具。

但是我看不到该怎么做。看起来当我从Visual Studio进行构建时,无法在项目构建之间共享状态,并且在解决方案构建之后似乎没有任何需要。

在命令行中,存在before。*。sln.targets和after。*。sln.targets,但它们在Visual Studio中不起作用。

似乎我想要的东西非常简单,我只想要一个工具在构建后自动查看解决方案的二进制文件,因此我认为这应该是不可能的。但是我从文档中看不到该怎么做。我是MSBuild的新手,所以我可能缺少明显的东西。

msbuild msbuild-task visual-studio

6
推荐指数
1
解决办法
7711
查看次数

Visual Studio 忽略 msbuild before.<solutionName>.sln.targets 文件

我的最终目标是在构建解决方案时创建一个分发文件夹,该文件夹将包含我构建解决方案时的所有二进制文件和其他所需文件。我认为最好的方法是添加一个 before.solutionName.sln.targets 文件来创建这些目录。当我使用 msbuild.exe 和命令行构建项目时,会创建目录(来自 before.targets 文件)。但是,当我从 Visual Studio 中构建时,不会创建目录。我试图关闭解决方案并重新打开它以确保解决方案已重新加载。

此外,我知道我可以从项目文件中执行此操作,但由于解决方案包含多个项目,因此让每个解决方案都创建所需的目录是没有意义的。如果我可以让 Visual Studio 使用这些 .targets 文件,我可以在其他项目中以相同的形式重用它们。

msbuild c#-4.0 visual-studio-2013

6
推荐指数
0
解决办法
811
查看次数

构建解决方案后运行 MsBuild 任务(目标?)?

由于这个问题似乎令人困惑/不知所措,所以我将用我自己的部分形成的想法重新表述它。

我是否可以以某种方式设置一个批处理文件或在构建整个解决方案后运行的文件,并且该批处理文件将调用msbuild在某个项目中构建特定目标?为了让它工作,我必须以某种方式强制msbuild构建目标,而不考虑它是否认为它是“最新的”,因为这是我遇到的核心问题。

msbuild visual-studio

5
推荐指数
1
解决办法
6131
查看次数

在解决方案文件上调用自定义 MSBuild 目标

我有一个解决方案文件 ( MySolution.sln ),其中包含一个项目 ( MyProject.vcxproj )。我想通过解决方案在我的项目上执行自定义目标 ( MyCustomTarget )。它看起来像这样:

msbuild MySolution.sln /t:MyCustomTarget
Run Code Online (Sandbox Code Playgroud)

当我执行命令时,我会收到一条错误消息:

MySolution.sln.metaproj:错误 MSB4057:项目中不存在目标“MyCustomTarget”。[MySolution.sln]

您可以将MyCustomTarget替换为 Microsoft.Cpp.Win32.targets 中的任何标准目标(例如:ClCompile、Link)或您从 MyProject.vcxproj 中的 .targets 文件中选择的任何其他目标。他们都不会工作。

当环境变量msbuildemitsolution设置为 1 时,我可以检查生成的MySolution.sln.metaproj文件。在底部指定了 4 个目标:构建、重建、清理和发布。使用这些目标而不是MyCustomTarget,项目构建正常。此外,如果我指定项目文件而不是解决方案文件,它也会构建:

msbuild MyProject.vcxproj /t:MyCustomTarget
Run Code Online (Sandbox Code Playgroud)

但是使用这种格式,我将失去OutDir属性,必须手动设置ConfigurationPlatform,所以我失去了拥有解决方案文件的好处。

有什么方法可以将我的自定义目标与我最初打算的解决方案文件一起使用吗?

据我了解,问题是 msbuild 生成了这个中间项目文件(mysolution.sln.metproj),但这将赢得来自MyProject.vcxproj的导入,包括 .targets 文件。难怪MyCustomTarget不被识别。

我目前的解决方法是将项目文件与 msbuild 一起使用,并尽量不要错过解决方案文件中的任何内容:

msbuild MyProject.vcxproj /t:MyCustomTarget /p:Configuration=MyConfig;Platform=MyPlatform;OutDir=MySolution\Platform_MyConfig\
Run Code Online (Sandbox Code Playgroud)

但这不是一个合适的解决方案,不灵活,容易出错,并且不会自动适应解决方案文件中的更改。

msbuild project solution target

5
推荐指数
1
解决办法
2581
查看次数