我是一个根本不喜欢Visual Studio的人,而且更愿意使用我高度配置的gvim来编辑代码而不是围绕IDE。
因此,我的目标是为Web应用程序编译C#代码,而不需要偶尔需要使用的膨胀> 2gb怪物。
目前,我可以使用以下批处理脚本编译现有代码: http://www.codeproject.com/Questions/495608/howplustopluspublishplussiteplususingplusaspnet_co
问题在于需要项目文件和解决方案文件。有没有办法隔离这些是如何生成的(如果我可以获得Visual Studio使用的现有脚本,我可以在自动脚本中使用远程机器的副本)或自己生成它们?
或者,或者,有没有办法绕过它们用于较小的项目和个别表格?不幸的是,我对aspnet_compiler的了解有限。答案 0 :(得分:6)
Microsoft.Build
命名空间是你的朋友!
示例:制作csproj:
var pathToLibs = @"..\..\..\libs\";
Engine engine=new Engine();
engine.BinPath=RuntimeEnvironment.GetRuntimeDirectory();
Project project=engine.CreateNewProject();
project.AddNewImport(@"$(MSBuildBinPath)\Microsoft.CSharp.targets", null);
BuildPropertyGroup props=project.AddNewPropertyGroup(false);
props.AddNewProperty("AssemblyName", "myassembly");
props.AddNewProperty("OutputType", "Library");
BuildItemGroup items=project.AddNewItemGroup();
var asmRef = items.AddNewItem("Reference", "SomLibFile");
asmRef.SetMetadata("HintPath", Path.Combine(pathToLibs, @"SomeLibFile.dll"));
items.AddNewItem("Compile", "somefile.cs");
project.Save(@"c:\temp\myproject.csproj");
从解决方案(.sln文件)生成“元项目”文件:
var foo = SolutionWrapperProject.Generate(
@"path.to.my.sln",
"4.0",
null);
翻找,翻找啊哈哈 - 知道我有这个;实际构建生成的元项目/解决方案文件的项目的示例:
var solutionProjects =
from buildLevel in Enumerable.Range(0, 10)
let buildLevelType = "BuildLevel" + buildLevel
let buildLevelItems = slnProj.GetItems(buildLevelType)
from buildLevelItem in buildLevelItems
let include = buildLevelItem.EvaluatedInclude
where !(include.Contains("UnitTests") || include.Contains("Unit Tests"))
select new { Include=include, Project = pc.LoadProject(Path.Combine(basePath, include))};
foreach (var projectPair in solutionProjects)
{
var project = projectPair.Project;
string.Format("OutDir={0}", project.ExpandString("$(OutDir)")).Dump();
string.Format("OutputPath={0}", project.ExpandString("$(OutputPath)")).Dump();
continue;
var include = projectPair.Include;
var outputPath = outputDir;
project.SetProperty("OutputPath", outputPath);
var projectLogger = new BasicFileLogger();
var tempProjectLogPath = Path.GetTempFileName();
projectLogger.Parameters = tempProjectLogPath ;
Console.WriteLine("Building project:" + project.DirectoryPath);
var buildOk = project.Build("Build", new[]{projectLogger});
if(buildOk)
{
Console.WriteLine("Project build success!");
}
else
{
var logDump = File.ReadAllText(tempProjectLogPath);
logDump.Dump();
throw new Exception("Build failed");
}
}