예제 #1
0
        public void ProjectFilePaths()
        {
            DotNetProject project = Services.ProjectService.CreateDotNetProject("C#");
            string        dir     = Environment.CurrentDirectory;

            ProjectFile file1 = project.AddFile(Util.Combine(dir, "test1.cs"), BuildAction.Compile);

            Assert.AreEqual(Util.Combine(dir, "test1.cs"), file1.Name);

            ProjectFile file2 = project.AddFile(Util.Combine(dir, "aaa", "..", "bbb", "test2.cs"), BuildAction.Compile);

            Assert.AreEqual(Util.Combine(dir, "bbb", "test2.cs"), file2.Name);

            ProjectFile file = project.Files.GetFile(Util.Combine(dir, "test1.cs"));

            Assert.AreEqual(file1, file);

            file = project.Files.GetFile(Util.Combine(dir, "aaa", "..", "test1.cs"));
            Assert.AreEqual(file1, file);

            file = project.Files.GetFile(Util.Combine(dir, "bbb", "test2.cs"));
            Assert.AreEqual(file2, file);

            file = project.Files.GetFile(Util.Combine(dir, "aaa", "..", "bbb", "test2.cs"));
            Assert.AreEqual(file2, file);
        }
		protected override string GenerateDescriptionFiles (DotNetProject project, FilePath basePath)
		{
			if (!project.Items.GetAll<WebReferencesDir> ().Any ()) {
				WebReferencesDir met = new WebReferencesDir ();
				met.Path = basePath.ParentDirectory;
				project.Items.Add (met);
			}
			
			WebReferenceUrl wru = project.Items.GetAll<WebReferenceUrl> ().FirstOrDefault (m => m.RelPath.CanonicalPath == basePath);
			if (wru == null) {
				wru = new WebReferenceUrl (protocol.Url);
				wru.RelPath = basePath;
				project.Items.Add (wru);
			}
			
			protocol.ResolveAll ();
			DiscoveryClientResultCollection files = protocol.WriteAll (basePath, "Reference.map");
			
			foreach (DiscoveryClientResult dr in files)
				project.AddFile (new FilePath (dr.Filename).ToAbsolute (basePath), BuildAction.None);
			
			return Path.Combine (basePath, "Reference.map");
		}
		public static void AddController (DotNetProject project, string path, string name)
		{
			var provider = project.LanguageBinding.GetCodeDomProvider ();
			if (provider == null)
				throw new InvalidOperationException ("Project language has null CodeDOM provider");

			string outputFile = null;
			MvcTextTemplateHost host = null;
			AddControllerDialog dialog = null;

			try {
				dialog = new AddControllerDialog (project);
				if (!String.IsNullOrEmpty (name))
					dialog.ControllerName = name;

				bool fileGood = false;
				while (!fileGood) {
					var resp = (Gtk.ResponseType) MessageService.RunCustomDialog (dialog);
					dialog.Hide ();
					if (resp != Gtk.ResponseType.Ok || !dialog.IsValid ())
						return;

					outputFile = System.IO.Path.Combine (path, dialog.ControllerName) + ".cs";

					if (System.IO.File.Exists (outputFile)) {
						fileGood = MessageService.AskQuestion ("Overwrite file?",
								String.Format ("The file '{0}' already exists.\n", dialog.ControllerName) +
								"Would you like to overwrite it?", AlertButton.OverwriteFile, AlertButton.Cancel)
							!= AlertButton.Cancel;
					} else
						break;
				}

				host = new MvcTextTemplateHost {
					LanguageExtension = provider.FileExtension,
					ItemName = dialog.ControllerName,
					NameSpace = project.DefaultNamespace + ".Controllers"
				};

				host.ProcessTemplate (dialog.TemplateFile, outputFile);
				MonoDevelop.TextTemplating.TextTemplatingService.ShowTemplateHostErrors (host.Errors);

			} finally {
				if (host != null)
					host.Dispose ();
				if (dialog != null) {
					dialog.Destroy ();
					dialog.Dispose ();
				}
			}

			if (System.IO.File.Exists (outputFile)) {
				project.AddFile (outputFile);
				IdeApp.ProjectOperations.SaveAsync (project);
			}
		}
		protected override string GenerateDescriptionFiles (DotNetProject dotNetProject, FilePath basePath)
		{
			if (!dotNetProject.Items.GetAll<WCFMetadata> ().Any ()) {
				var met = new WCFMetadata ();
				met.Path = basePath.ParentDirectory;
				dotNetProject.Items.Add (met);
			}
			
			WCFMetadataStorage metStor = dotNetProject.Items.GetAll<WCFMetadataStorage> ().FirstOrDefault (m => m.Path.CanonicalPath == basePath);
			if (metStor == null)
				dotNetProject.Items.Add (new WCFMetadataStorage { Path = basePath });
			
			string file = Path.Combine (basePath, "Reference.svcmap");
			if (protocol != null) {
				protocol.ResolveAll ();
				protocol.WriteAll (basePath, "Reference.svcmap");
				refGroup = ConvertMapFile (file);
			} else {
				// TODO
				var map = new ReferenceGroup ();
				map.ClientOptions = defaultOptions;
				map.Save (file);
				map.ID = Guid.NewGuid ().ToString ();
				refGroup = map;
			}
			foreach (MetadataFile mfile in refGroup.Metadata)
				dotNetProject.AddFile (new FilePath (mfile.FileName).ToAbsolute (basePath), BuildAction.None);
			
			return file;
		}
		public static void AddView (DotNetProject project, string path, string name)
		{
			var provider = project.LanguageBinding.GetCodeDomProvider ();
			if (provider == null)
				throw new InvalidOperationException ("Project language has null CodeDOM provider");

			string outputFile = null;
			MvcTextTemplateHost host = null;
			AddViewDialog dialog = null;

			try {
				dialog = new AddViewDialog (project);
				dialog.ViewName = name;

				bool fileGood = false;
				while (!fileGood) {
					var resp = (Gtk.ResponseType) MessageService.RunCustomDialog (dialog);
					dialog.Hide ();
					if (resp != Gtk.ResponseType.Ok || ! dialog.IsValid ())
						return;

					string ext = ".cshtml";
					if (dialog.ActiveViewEngine == "Aspx")
						ext = dialog.IsPartialView ? ".ascx" : ".aspx";

					if (!System.IO.Directory.Exists (path))
						System.IO.Directory.CreateDirectory (path);

					outputFile = System.IO.Path.Combine (path, dialog.ViewName) + ext;

					if (System.IO.File.Exists (outputFile)) {
						fileGood = MessageService.AskQuestion (GettextCatalog.GetString ("Overwrite file?"),
							GettextCatalog.GetString ("The file '{0}' already exists.\n", dialog.ViewName) +
							GettextCatalog.GetString ("Would you like to overwrite it?"), AlertButton.OverwriteFile, AlertButton.Cancel)
							!= AlertButton.Cancel;
					} else
						break;
				}

				host = new MvcTextTemplateHost {
					LanguageExtension = provider.FileExtension,
					ItemName = dialog.ViewName,
					ViewDataTypeString = ""
				};

				if (dialog.HasMaster) {
					host.IsViewContentPage = true;
					host.ContentPlaceholder = dialog.PrimaryPlaceHolder;
					host.MasterPage = dialog.MasterFile;
					host.ContentPlaceHolders = dialog.ContentPlaceHolders;
				}
				else if (dialog.IsPartialView)
					host.IsViewUserControl = true;
				else
					host.IsViewPage = true;

				if (dialog.IsStronglyTyped)
					host.ViewDataTypeString = dialog.ViewDataTypeString;

				host.ProcessTemplate (dialog.TemplateFile, outputFile);
				MonoDevelop.TextTemplating.TextTemplatingService.ShowTemplateHostErrors (host.Errors);

			} finally {
				if (host != null)
					host.Dispose ();
				if (dialog != null) {
					dialog.Destroy ();
					dialog.Dispose ();
				}
			}

			if (System.IO.File.Exists (outputFile)) {
				project.AddFile (outputFile);
				IdeApp.ProjectOperations.SaveAsync (project);
			}
		}
		protected override async Task<string> GenerateDescriptionFiles (DotNetProject dotNetProject, FilePath basePath)
		{
			if (!dotNetProject.Items.GetAll<WebReferencesDir> ().Any ()) {
				var met = new WebReferencesDir (basePath.ParentDirectory);
				dotNetProject.Items.Add (met);
			}

			DiscoveryClientResultCollection files = await Task.Run (() => {
				WebReferenceUrl wru = dotNetProject.Items.GetAll<WebReferenceUrl> ().FirstOrDefault (m => m.RelPath.CanonicalPath == basePath);
				if (wru == null) {
					wru = new WebReferenceUrl (protocol.Url);
					wru.RelPath = basePath;
					dotNetProject.Items.Add (wru);
				}

				protocol.ResolveAll ();
				return protocol.WriteAll (basePath, "Reference.map");
			});
			
			foreach (DiscoveryClientResult dr in files)
				dotNetProject.AddFile (new FilePath (Path.GetFileName (dr.Filename)).ToAbsolute (basePath), BuildAction.None);
			
			return Path.Combine (basePath, "Reference.map");
		}
		static ProjectFile MigrateToProjectJson (DotNetProject project)
		{
			var projectJsonName = project.BaseDirectory.Combine ("project.json");
			var projectJsonFile = new ProjectFile (projectJsonName, BuildAction.None);

			bool isOpen = false;
			JObject json;
			ITextDocument file;

			if (System.IO.File.Exists (projectJsonName)) {
				file = TextFileProvider.Instance.GetTextEditorData (projectJsonFile.FilePath.ToString (), out isOpen);
				using (var tr = file.CreateReader ())
				using (var jr = new Newtonsoft.Json.JsonTextReader (tr)) {
					json = (JObject)JToken.Load (jr);
				}
			} else {
				file = TextEditorFactory.CreateNewDocument ();
				file.FileName = projectJsonName;
				file.Encoding = Encoding.UTF8;
				json = new JObject (
					new JProperty ("dependencies", new JObject ()),
					new JProperty ("frameworks", new JObject())
				);
			}

			var packagesConfigFile = project.GetProjectFile (project.BaseDirectory.Combine ("packages.config"));
			if (packagesConfigFile != null) {
				//NOTE: it might also be open and unsaved, but that's an unimportant edge case, ignore it
				var configDoc = System.Xml.Linq.XDocument.Load (packagesConfigFile.FilePath);
				if (configDoc.Root != null) {
					var deps = (json ["dependencies"] as JObject) ?? ((JObject)(json ["dependencies"] = new JObject ()));
					foreach (var packagelEl in configDoc.Root.Elements ("package")) {
						deps [(string)packagelEl.Attribute ("id")] = (string)packagelEl.Attribute ("version");
					}
				}
			}

			var framework = GetPclProfileFullName (project.TargetFramework.Id) ?? NetStandardDefaultFramework;
			json ["frameworks"] = new JObject (
				new JProperty (framework, new JObject())
			);

			file.Text = json.ToString ();

			if (!isOpen) {
				file.Save ();
			}

			project.AddFile (projectJsonFile);
			if (packagesConfigFile != null) {
				project.Files.Remove (packagesConfigFile);

				//we have to delete the packages.config, or the NuGet addin will try to retarget its packages
				FileService.DeleteFile (packagesConfigFile.FilePath);

				//remove the package refs nuget put in the file, project.json doesn't use those
				project.References.RemoveRange (project.References.Where (IsFromPackage).ToArray ());
			}

			return projectJsonFile;
		}