【发布时间】:2013-12-15 19:04:13
【问题描述】:
我正在编写一个 VSIX 包,以允许用户在当前加载的解决方案中批量编辑项目的所有活动配置的 OutputPath 属性(请参阅令人难以置信的烦人步骤 #4 here)。
我遇到了一个非常具体的问题:将属性设置为包含宏的值时(例如"$(SolutionDir)\bin\Debug",写入 .csproj 的值如下转义:
<OutputPath>%24%28SolutionDir%29\bin\Debug\</OutputPath>
与其让 MSBuild 扩展宏,不如创建一个名为 $(SolutionDir) 的实际物理文件夹。我想以某种方式绕过这种转义。
毫无疑问,该领域缺少 MSDN 文档。
我的初始代码如下:
private void MenuItemCallback(object sender, EventArgs e)
{
SolutionWideOutputDialogWindow dialog = new SolutionWideOutputDialogWindow();
dialog.ShowModal();
if (!dialog.DialogResult.HasValue || !dialog.DialogResult.Value)
{
return;
}
string requestedOutputPath = dialog.outputPathTextBox.Text;
Solution2 solution = _dte2.Solution as Solution2;
if (solution == null)
{
return;
}
Projects projects = solution.Projects;
foreach (Project project in projects)
{
Property outputPath = project.ConfigurationManager.ActiveConfiguration.Properties.Item("OutputPath");
outputPath.Value = requestedOutputPath;
project.Save();
}
}
非常感谢任何人的帮助。
【问题讨论】:
-
使用 IDE 执行此操作时会发生完全相同的事情。 IDE 也没有给出任何支持宏的提示。假设您无法完成这项工作,这是非常安全的。请改用相对路径,例如
..\bin\debug。 -
嗯,MSBuild 确实支持它,但这让我只能直接编辑底层项目文件
-
“为所有项目执行 x”的 msbuild/VS 方式是使用在所有项目中导入的通用文件。您可以通过在每个项目中添加该文件来手动(或编写脚本)执行此操作,也可以使用全局文件(例如在
$(VCTargetsPath)\Platforms\Win32\ImportBefore中)。在全局中设置 OutputPath 就完成了。我真的建议使用通用文件来定义几乎所有内容(编译器/链接器/工具选项和所有路径),毕竟这是 DRY 的问题。 -
这实际上是我已经完成的,但是当我想在每个解决方案配置的基础上使输出路径全局化时遇到了一个问题(即 $(SolutionDir)bin\$(SolutionConfigurationName) \$(解决方案平台名称))。 MSBuild 导出的宏是基于每个项目的,因此如果您的项目平台没有完全统一命名,则无法正常工作。我最终找到了一个 Visual Studio 插件,可以从 IDE 中为我导出这些内容。我不得不稍微调整一下,让它更早地导出它们而不破坏 VS 功能,但我现在很满意。
标签: c# visual-studio-2012 msbuild envdte