| #region Copyright notice and license | |
| // Copyright 2018 gRPC authors. | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| #endregion | |
| using System.Collections.Generic; | |
| using Microsoft.Build.Framework; | |
| using Microsoft.Build.Utilities; | |
| namespace Grpc.Tools | |
| { | |
| public class ProtoReadDependencies : Task | |
| { | |
| /// <summary> | |
| /// The collection is used to collect possible additional dependencies | |
| /// of proto files cached under ProtoDepDir. | |
| /// </summary> | |
| [Required] | |
| public ITaskItem[] Protobuf { get; set; } | |
| /// <summary> | |
| /// Directory where protoc dependency files are cached. | |
| /// </summary> | |
| [Required] | |
| public string ProtoDepDir { get; set; } | |
| /// <summary> | |
| /// Additional items that a proto file depends on. This list may include | |
| /// extra dependencies; we do our best to include as few extra positives | |
| /// as reasonable to avoid missing any. The collection item is the | |
| /// dependency, and its Source metadatum is the dependent proto file, like | |
| /// <ItemName Include="/usr/include/proto/wrapper.proto" | |
| /// Source="my_proto.proto" /> | |
| /// </summary> | |
| [Output] | |
| public ITaskItem[] Dependencies { get; private set; } | |
| public override bool Execute() | |
| { | |
| // Read dependency files, where available. There might be none, | |
| // just use a best effort. | |
| if (ProtoDepDir != null) | |
| { | |
| var dependencies = new List<ITaskItem>(); | |
| foreach (var proto in Protobuf) | |
| { | |
| string[] deps = DepFileUtil.ReadDependencyInputs(ProtoDepDir, proto.ItemSpec, Log); | |
| foreach (string dep in deps) | |
| { | |
| var ti = new TaskItem(dep); | |
| ti.SetMetadata(Metadata.Source, proto.ItemSpec); | |
| dependencies.Add(ti); | |
| } | |
| } | |
| Dependencies = dependencies.ToArray(); | |
| } | |
| else | |
| { | |
| Dependencies = new ITaskItem[0]; | |
| } | |
| return !Log.HasLoggedErrors; | |
| } | |
| }; | |
| } |