假設我將自定義目標添加到csproj文件。有沒有辦法從Visual Studio中運行該目標?我不想讓它成爲預構建或構建後步驟,我只是希望能夠從visual studio運行此目標(及其依賴項)。從VisualStudio運行自定義msbuild目標
回答
使用自定義的外部工具有一個簡單的方法(儘管不是所有滿意的)。
假設你的項目文件的以下修改:
<Target Name="CalledFromIde">
<Error Text="Called from the IDE!" />
</Target>
轉到工具|外部工具,並添加一個這樣的:
Title: Called from IDE
Command: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe
Arguments: $(ProjectDir)$(ProjectFileName) /t:CalledFromIde
Initial directory: $(ProjectDir)
Use Output window: checked
運行此產生輸出爲:
Build FAILED.
"F:\Code\CsProject\CsProject.csproj" (CalledFromIde target) (1) ->
(CalledFromIde target) ->
F:\Code\CsProject\CsProject.csproj(57,5): error : Called from the IDE!
你在做什麼在呼喚出來的MSBuild作爲外部工具,並讓它直接運行的目標。您必須提供MSBuild的完整路徑,因爲IDE不會保留與其創建的構建環境相同的屬性。
您可以通過計算出它在Tools.ExternalCommand#集合中的哪個命令#來將它連接到快捷方式。
如果您正在尋找一個更復雜的解決方案,它會涉及更多一點。這裏簡單地說(VS2010):
1)創建一個VS Addin(File | New | Project | Other Project Types | Extensibility | Visual Studio Add-in)。我不確定您是否必須安裝VS SDK才能獲得該版本,它可以在擴展管理器中找到。
在嚮導中選擇下列選項: - 微軟的Visual Studio 2010 - 是的,創建「工具」菜單項 - 加載應用程序啓動時 - 我的外接絕不會容忍模式UI,和可以與命令行構建一起使用。
2)添加引用Microsoft.Build和Microsoft.Build.Framework
3)查找Exec的在Connect.cs實現文件
4)替換爲以下代碼:
public void Exec(
string commandName,
vsCommandExecOption executeOption,
ref object varIn,
ref object varOut,
ref bool handled)
{
handled = false;
if (executeOption != vsCommandExecOption.vsCommandExecOptionDoDefault)
return;
if (commandName != "BuildAddin.Connect.BuildAddin")
return;
var doc = _applicationObject.ActiveDocument;
var projectItem = doc.ProjectItem;
var project = projectItem.ContainingProject;
var evalProject =
Microsoft.Build.Evaluation.ProjectCollection
.GlobalProjectCollection.LoadProject(project.FullName);
var execProject = evalProject.CreateProjectInstance();
bool success = execProject.Build("CalledFromIde", null);
var window = _applicationObject.Windows.Item(Constants.vsWindowKindOutput);
var output = (OutputWindow)window.Object;
OutputWindowPane pane = output.OutputWindowPanes.Add("BuildAddin");
pane.OutputString(success ? "built /t:CalledFromIde" : "build failed");
handled = true;
return;
}
5)在調試好自定義的目標,因爲以前的一個錯誤:
<Target Name="CalledFromIde">
<WriteLinesToFile File="CalledFromIde.txt" Lines="Called from the IDE!" />
</Target>
6)爲簡潔起見,上面的代碼沒有錯誤檢查,因爲它將在IDE中運行,所以您希望更清潔。插件會在你的工具菜單上放置一個菜單項。如上所述,它只是尋找包含當前活動編輯器文檔的項目,無論你做什麼,都需要更好的管道。
該技巧從IDE中獲取構建引擎實例,並使其在單獨的項目實例上執行構建。
你不必用Exec編寫代碼,儘管這是一種方法。更簡單的方法是做到以下幾點:
更改DefaultTargets="Build"
屬性自定義目標創建,說"All"
像這樣:
DefaultTargets="All"
然後在您的自定義的「所有」目標,您可以使用DependsOnTargets屬性,如下所示:
"<Target Name="All" DependsOnTargets="ZipOutputFiles;Build">
</Target>"
然後,這將建立和出把zip文件在您的自定義"All"
目標。
如果您在Visual Studio中運行構建,則在構建期間將會有VisualStudioDir的構建變量。
僅執行是VS建立會話做到這一點:
<Target Name="Test" BeforeTargets="Build" Condition="'$(VisualStudioDir)' != ''>
</Target>
要只在VS之外構建執行此操作:
<Target Name="Test" BeforeTargets="Build" Condition="'$(VisualStudioDir)' == ''>
</Target>
您將需要包括您的自定義目標文件以兩種方式之一。
- 設置環境變量CustomBeforeMicrosoftCommonTargets
編輯你的項目文件中加入進口
<Imports Project="CustomBuildTasks.Targets"><Imports/>
- 1. 通過msbuild添加和運行自定義目標
- 2. 自定義的MSBuild目標不包括目錄
- 3. VisualStudio-自定義平臺
- 4. VisualStudio VSPackage自定義命令
- 5. 構建失敗後運行MSBuild目標
- 6. MSBuild - 執行自定義目標無w/o修改單個項目
- 7. 將自定義msbuild目標從解決方案傳遞到項目
- 8. AfterBuildCompiler(msbuild)目標定義在哪裏?
- 9. 從msbuild調用VS自定義工具
- 10. MSBuild從自定義任務參數
- 11. MSBuild BuildInParallel,運行失敗的自定義任務產卵過程
- 12. MSBuild:在指定解決方案時構建自定義項目目標
- 13. 如何使用MSBuild從後期構建事件運行目標
- 14. 目標運行時JBoss v4.2未定義
- 15. 爲MSBuild自定義Windows CMD
- 16. 自定義任務MSBuild
- 17. msbuild自定義任務
- 18. MSBuild自定義規則
- 19. MSBuild - 目標從屬進口
- 20. 自定義目標/正在運行的任意代碼
- 21. 在cobertura插件中運行自定義目標
- 22. 運行不帶pom.xml的自定義Maven目標
- 23. 僅在編譯時運行自定義目標
- 24. 如何在Intellij IDEA中運行自定義Maven目標?
- 25. 如何讓我的自定義目標只在運行ant版本時運行?
- 26. 從Eclipse運行自定義部署者
- 27. 運行的MSBuild從PowerShell的
- 28. 從MSBuild運行Grunt Typescript
- 29. 從TeamCity運行MSBuild腳本
- 30. 只有在實際構建項目時才運行MSBuild目標